关于python环境下的语音转文本,whisper或funASR-CSDN博客

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

        因为前阵子有需求要将语音转为文本再进行下一步操作。感觉这个技术也不算是什么新需求但是一搜都是大厂的api或者是什么什么软件由于想要免费的同时也要嵌入在代码中所以这些都不能用。、

        一筹莫展的时候突然搜到whisper这是个openai开源的工具主打就是语音转文本。试了一下还是不错的虽然搜到的大多数介绍都是关于怎么直接命令行使用的但是也有少量关于api的介绍结合源码看了一下还是很容易操作的。

        这个项目从安装开始这个项目可能是太有名了还是啥有很些大神进行了扩展和优化所以直接pip安装的话需要注意是pip install openai-whisper直接装whisper不是那个哟。git地址openai-whispericon-default.png?t=N7T8https://github.com/openai/whisper使用上在代码中import之后whisper.load_model传入模型名就可以了不传的话默认是small个人觉得已经挺好的了会自动下载自动下载的权重是pt格式的如果去hf下载的话好像是bin格式需要注意。模型名可以在源码中看到或者是git上好像也有。顺便一提由于hf需要科技但是源码中的链接不是hf上的下载速度还可以。

使用的时候model.transcribe再传入音频文件就可以了。是的这个项目本身是不支持实时转录的并且传入的文件他是通过ffmpeg来进行处理的所以使用前需要安装ffmpeg。在使用transcribe方法的时候还能追加一些参数比如language中文传zh或Chinese如果不传会自动检测音频前面一部分的主要语言并且输出该语言。

需要注意的是这个项目不支持多语言输出注意是输出比如设定为中文则无论输入音频是啥语言输出都是中文但中文是不是翻译的不太确认。这边试过英文输入一段中文录音结果输出是全英文并且翻译后的英文不是同音乱码啥的。其他参数建议就默认就行了。比如如果torch检测到cuda可以用就会自动切换cuda并且量化fp16如果是纯cpu则fp16会报一个提示不可用自动设为false。如果本机有显卡但是加载显存不够而需要转cpu的话则是在load_model方法设置device但是即便是最大的模型12G显存应该也是够用的没仔细看。

这个项目有一些不足第一输入空白音频或者特别短的音频的时候输出的文字是不对的但是他有个参数名为no_speech_prob顾名思义就是无人说话的概率第二接上一条no_speech_prob这个值不太准所以通过这个值进行过滤的时候有可能会漏掉内容第三再接上一条还是no_speech_prob这个值这边测试用小说软件读小说基本上都认定无人说话所以这个值莫非是检测是否是真人么但对于真人录音同样存在该值变动较大且不准的情况即对于我的一段录音总是会漏掉一些内容第四输出中文是繁体有需要的简体的话要再用zhconv转一下zhconv.convert(text,'zh-cn')第五速度快但还不够快。

        由whisper的速度引发了下一个项目不够快经过一番查找下面这个项目还是不错的

faster-whispericon-default.png?t=N7T8https://github.com/guillaumekln/faster-whisperFasterWhsiperGUI 更快更强更好用的 whisper - 哔哩哔哩 (bilibili.com)

这个链接写了一些对于whisper的一些评价顺便推广了他自己的项目他的项目似乎就是对faster这个的包装弄了一个界面。所以我就直接使用faster了。

直接说结论速度确实提升很大不过宣称的4倍提升倒是没有测出来但是两倍提升还是有的。其模型不能和原版模型共用下载的话需要去hf下不过他也提供了将原版模型转为自己可用的模型但是原版模型也要是hf的版本所以科技还是少不了。

该项目的主要提升是速度提升很大但是准确率没下降很多但是这边测着略有下降吧不知道是不是个体差异非专业和大量测试。

这两个whisper项目优点是速度快准确度还不错缺点是幻听问题和返回是纯文本没有标点的话对于短文本还好如果语句较长歧义的风险比较大不过他们都有返回时间戳自己判断一下在间隔较大的地方加个逗号也算满足要求。

但是由于我需要做的是语音ai对话这样的话如果输入文字有错误的话ai的回复可能就会很莫名其妙所以我需要找一个准确度更高的项目此时强烈推荐funASR项目由阿里达摩院开源。

funASRicon-default.png?t=N7T8https://github.com/alibaba-damo-academy/FunASR这个项目有点大功能有点多不过教程也是非常多的简要说明一下该项目支持三种模式2pass实时转录并且会回头检测输出的文本自动进行修改和标点添加online似乎是实时转录但是不会回头检测没用过offline对全音频检测就是输出2pass的最终结果中间过程不输出。后面我用的全都offline模式简单说一下其中的坑最关键的是从项目介绍来看至少目前还不支持gpu虽然用的时候好像显存有增加但是他自己说gpu版还在进行中。

首先我是git下载源文件再安装的因为如果pip下载的话我不知道源文件在哪而他的快速使用教程里面需要找到源文件再去某个目录下开启服务端再通过客户端请求转录文本虽然有点麻烦但是准确率比前面的高并且他自己介绍说一般的硬件水平下也能支持百路并发还是比较心动的毕竟whisper的话岂不是要我自己写flask来回应请求效率不敢想。

此时发现他的python服务端只能支持一路要多路并行需要编译不知道win能不能编译反正教程是只写了linux怎么编。

再python环境下同一段1分多几秒的音频whisper需要10s左右large模型faster需要4s左右也是large模型但是内容有缺漏换成small模型只需要3s不到内容反而不缺漏了。funasr用了33s调用的是源文件中提供的api代码里面有一些等待参数都设为非常小的值了0.0001什么的这才到33s如果设大一些等待更久。查看api代码可知他的请求方式是将音频循环读取chunk并发给服务端服务端此时会返回识别内容所以随着循环的进行返回的内容会越来越多越来越准可以理解2pass模式是怎么工作的了。然后在最后关闭这个连接此时会发来一个最终结果这个就是offline的结果。不太能理解为什么不能一次输入全文件然后直接得到结果。但是问题在于在调用api的时候发现他最终结果经常发来一个空反而是循环体中返回的内容是可用和正确的。感觉还是主打2pass至少这个api文件是这样如果设置为2pass模式的话能看到每一步的返回还有内容的修改挺有意思的大概是流式输出的意思。

总结funasr准确率高有标点但是慢极慢。

事情还没完在使用funasr之后既眼馋他的准确又遗憾他的速度难道就不能两全么原本我的目标是放在c++编译上大不了编译出来一个按说python转成c++之后十倍提升应该不是问题才对。

此时仔细研究了下源码文件发现之前使用的是runtime下的python目录的websocket而python目录下还有onnx和libtorch从目录名来看这个项目貌似支持很多语言然后仅就python而言也有多种实现方式。

这边试了下libtorch其每个文件夹下都有一个readme和demo比较详细的介绍了怎么用比如如何安装 torch版然后怎么转换模型因为直接下载的模型是pb格式他需要转成torchscript格式这一步卡了我好就因为没有关注到这一点一直以为是我下载的模型不对而在modelscope中搜索半天找不到之后都准备提issue了然后再一次看readme的时候发现开头就写了要装onnx来转一下权重。而且不知道是不是路径问题转换的时候会重新下载权重到当前目录下然后再转所以可以提前把默认路径下的权重拷贝到当前目录。

demo中关于model的加载有一条是注释了gpu的但是使用的话无论传什么音频进去都提示“input wav is silence or noise”不信邪的我再查看源码发现这句打印只是在except中打开注释掉的traceback.format_exc()会打印真实原因说是two device看报错似乎不是我可以解决的于是还是改为cpu版此时速度只需要3s左右准确率很好但是没有了标点只有一大段文字。然后下载官方长音频版权重带vad和punc输出还是没有标点最后根据每个字的时间戳遍历了一遍总耗时达到4s再改用gevent只需要分析相邻两字的时间即可此时总耗时大概是3s行吧不想折腾了。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: python