语音识别一直以来都是人工智能领域中一个不容忽视的技术,随着大模型时代的到来,这项技术也发生了质的变化。凡是在AI相关的讨论中,语音识别绝对是一个高热的话题。
目前开源的语音识别软件中,Openai Whisper绝对是霸主的存在,他在这方面的表现甚至超越了很多商用的产品,那么Openai Whisper对中文的支持如何呢,今天我们来简单测试一下。
一、资料准备因为今天我们主要研究中文识别,所以这里我准备了一个比较有特色的音频。语音文件如下面所示:
一年级-小青蛙(标准普通话):1.mp3(532K) 点击下载内容如下:
河水清清天气晴,小小青蛙大眼睛。保护禾苗吃害虫,做了不少好事情。请你爱护小青蛙,好让禾苗不生病。
三字经素读11(标准普通话):2.mp3(533K) 点击下载内容如下:
读史者,考实录。通古今,若亲目。昔仲尼,师项橐。古圣贤,尚勤学。赵中令,读鲁论。彼既仕,学且勤。披蒲编,削竹简。彼无书,且知勉。头悬梁,锥刺股。彼不教,自勤苦。如囊萤,如映雪。家虽贫,学不辍。如负薪,如挂角。身虽劳,犹苦卓。
一段粤语(和普通话接近度很低):3.mp3(306K) 点击下载内容如下:
广式粤语和港式粤语作为粤语地区最有代表性的两种,到底有没有区别?那它们又是不是相通的呢?接下来,我就用它们当中比较独特的表达随机采访了几位路人,看下他们对广式粤语和港式粤语的态度是怎么样的呢?
李伯伯的一段评书(四川话-和普通话接近度较高):4.mp3(1.4M) 点击下载内容有点长,后面再看看识别情况
二、Whisper环境搭建目前Openai Whisper是人气最高的开源的语音识别项目,项目地址:【https://github.com/openai/whisper】从名字就可以看出,它是有openai开源出来的,主要利用大模型来训练。支持99 种语言,特别是对英语的支持错误率很低。Whipser 推出了 tiny、base、small、medium、large 5 个档次的模型。
模型大小英语多语言所需显存相对速率tiny39 Mtiny.entiny~1 GB~32xbase74 Mbase.enbase~1 GB~16xsmall244 Msmall.ensmall~2 GB~6xmedium769 Mmedium.enmedium~5 GB~2xlarge1550 MN/Alarge~10 GB1xWhisper的错误率如下图所示:
下面我来看看如何安装,安装Whipser需要Python环境,所需要的环境如下:
Python 3.9.9+pip 24.0+ffmpeg首先检查电脑环境是否满足,如果已经满足,执行以下命令:
第一步:安装whisper pip install -U openai-whisper当看到有类似下面的输出表示安装成功:
Building wheels for collected packages: openai-whisper Building wheel for openai-whisper (pyproject.toml) ... done Created wheel for openai-whisper: filename=openai_whisper-20231117-py3-none-any.whl size=801358 sha256=9c53589d5935329764df742678ccdf63238285771a946ef7157912e71a623bb3 Stored in directory: /root/.cache/pip/wheels/0f/3e/0a/683df97c94e7b6f0818ba78f0177ebe638c30d192bdd39f399Successfully built openai-whisper 第二步:安装ffmpeg安装ffmpeg,这里不一样的系统安装方式也不一样,下面给出了几种系统的安装方式:
# on Ubuntu or Debiansudo apt update && sudo apt install ffmpeg# on Arch Linuxsudo pacman -S ffmpeg# on MacOS using Homebrew (https://brew.sh/)brew install ffmpeg# on Windows using Chocolatey (https://chocolatey.org/)choco install ffmpeg# on Windows using Scoop (https://scoop.sh/)scoop install ffmpeg如果你是centos,在centos7上安装ffmpeg还需要多几个步骤,具体如下: 导入Nux Dextop仓库:
sudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.rosudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-1.el7.nux.noarch.rpm安装
sudo yum update -ysudo yum install ffmpeg -y安装成功后验证ffmpeg
ffmpeg -help 三、Whisper测试安装成功后,我们可以直接在控制台使用:
whisper --help如果我们要进行识别操作,具体命令如下:
whisper audio.mp3 --命令参数常用参数说明:
–task
指定转录方式,默认使用 --task transcribe 转录模式,–task translate 则为翻译模式,目前只支持英文。
–model
指定使用模型,默认使用 --model small,Whisper 还有英文专用模型,就是在名称后加上 .en,这样速度更快。默认采用base
–language
指定转录语言,默认会截取 30 秒来判断语种,但最好指定为某种语言,比如指定中文是 --language Chinese。
–device
指定硬件加速,默认使用 auto 自动选择,–device cuda 则为显卡,cpu 就是 CPU, mps 为苹果 M1 芯片。
output_format
识别结果输出格式(txt,vtt,srt,tsv,json,all),默认为:all
output_dir
识别结果输出目录
除了在控制台直接使用外,也可以在Python中使用,Python的示例代码如下:
# coding=utf-8import whisperif __name__ == '__main__':model = whisper.load_model("tiny")audio = whisper.load_audio("1.mp3")audio = whisper.pad_or_trim(audio)mel = whisper.log_mel_spectrogram(audio).to(model.device)_, probs = model.detect_language(mel)options = whisper.DecodingOptions()result = whisper.decode(model, mel, options)print(result.text)当然也可以直接在控制台来测试,这里我整理了测试的结果如下图: 这里我是直接输出的txt格式,如果输出vtt格式,可以看到响应的时间点,类似下面:
这里我编写了一个自动化测试的shell脚本,方便大家来做相关测试:
#!/bin/shsuffixes=("mp3")models=("tiny" "base" "small" "medium" "large")# models=("tiny" "base")find_audio(){ suffix=$1 for file in ./*.$suffix; do if [ -f "$file" ]; thentxt_rs=$(basename "$file")dir=$(basename "$file" | cut -d "." -f 1)for model in "${models[@]}"; do do_whisper $file $dir $modeldone fi done}do_whisper(){ start_time=$(date +%s) whisper $1 --language Chinese --output_dir $2_$3 --output_format txt --model=$3 end_time=$(date +%s) time_sec=$(($((end_time))-$((start_time)))) txt="(耗时:"$time_sec"秒)" rs_file=$2_$3/$2.txt echo "$txt" >> $rs_file}do_report(){ models_strs=$(printf ",%s" "${models[@]}") models_strs=${models_strs:1}cat > report.csv > report.csv fi done}for suffix in "${suffixes[@]}"; do find_audio ${suffix}donefor suffix in "${suffixes[@]}"; do do_report ${suffix}done大家可以修改里面的相关参数来自己做测试。
总结从上面的测试可以看出,对标准的普通话来说,识别已经相当成功了,同时最让我惊讶的是,他对粤语的识别竟然错误率这么低,基本上是翻译了过来。四川话因为发音比较接近普通话,但是有些地方词语差异还是很大,所以识别的时候错误率还是很高的。
总的来说,作为开源产品,whisper对中文的支持已经相当好了,甚至超越了一些国内商用的产品,我将这段粤语在几个大厂的平台上去测试了一下,大部分是识别不出来的,大家可以用我的脚本测试一下