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

        因为前阵子,有需求要将语音转为文本再进行下一步操作。感觉这个技术也不算是什么新需求,但是一搜,都是大厂的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,行吧,不想折腾了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/163072.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个三年女软件测试的成长之路

如果你恰好刚刚进入一家新公司,领导一上来就让你开展自动化测试,作为一名初出茅庐的测试新人,除了手足无措,你只能默默慨叹自己能力尚欠,眼前只会出现一个又一个无从下手的问题: 作为手工测试,…

55 零钱兑换

零钱兑换 题解1 DP另一种解法(更好记) 题解2 递归 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回…

1024程序员节特辑 | ELK+ 用户画像构建个性化推荐引擎,智能实现“千人千面”

专栏集锦,赶紧收藏以备不时之需 Spring Cloud实战专栏:https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏:https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏:https://blog.…

《Operating Systems:Three Easy Pieces》 操作系统导论【二】 虚拟化内存

【Operating Systems:Three Easy Pieces 操作系统导论 】 (九) 抽象:地址空间 早期系统 操作系统曾经是一组函数(实际上是一个库),在内存中(在本例中,从物理地址0开始),然后有一…

程序员各阶段应该掌握的技术与能力

人人都是产品经理 | 产品经理、产品爱好者学习交流平台 (woshipm.com)

华为云云耀云服务器L实例评测|使用clickhouse-benchmark工具对ClickHouse的性能测试

目录 引言 1 ClickHouse简介 2 利用docker安装ClickHouse 2.1 安装Docker 2.2 下载ClickHouse Docker镜像 2.3 创建ClickHouse容器 2.4 访问ClickHouse 3 创建测试表 4 运行 clickhouse-benchmark 5 分析结果 结语 引言 利用华为云的云耀云服务器L实例&#xff0c…

lunux查找占用内存前10的进程

1、使用Top命令查询进程 输入 top 命令,然后按下大写M按照内存MEM排序,按下大写P按照CPU排序。 2、查询占用CPU最高的前10个进程 ps aux|head -1;ps aux|grep -v PID|sort -rn -k 3|head 3、查询占用内存最大的前10个进程 ps aux|head -1;ps aux|grep …

【ELK使用指南 2】常用的 Logstash filter 插件详解(附应用实例)

Logstash filter 一、logstash filter过滤插件的常用模块简介二、grok 正则捕获插件2.1 grok插件的作用2.2 内置正则表达式2.3 自定义正则表达式 三、mutate 数据修改插件3.1 mutate插件的作用3.2 常用的配置选项3.3 mutate插件应用实例 四、multiline 多行合并插件4.1 multili…

电容元件符号与工作原理:电子电路中的电荷储存利器 | 百能云芯

电容是电子电路中常见的元件之一,它具有储存电荷的能力。在电路图中,电容有一个特定的元件符号,用于表示其存在和连接方式。接下来,云芯带您深入了解电容的元件符号以及它的工作原理。 电容的元件符号通常由两个平行的线段组成&am…

世界粮食日:宏工科技有对策,赋能食品生产高效可持续发展

10月16日是世界粮食日。随着全球人口的增长,人们对高品质食品的需求也越来越大,如何实现“更好生产、更好营养”成为了食品生产与供应的重要话题。15年来,宏工科技专注物料处理自动化领域,提供食品物料处理一站式解决方案以提高生…

滴滴弹性云基于 K8S 的调度实践

上篇文章详细介绍了弹性云混部的落地历程,弹性云是滴滴内部提供给网约车等核心服务的容器平台,其基于 k8s 实现了对海量 node 的管理和 pod 的调度。本文重点介绍弹性云的调度能力,分为以下部分: 调度链路图:介绍当前弹…

Pycharm安装第三方库的详细教程

**常用方法一:**内部安装 这种安装方法是我们经常使用的一种,进入到pycharm界面中,点击菜单栏上的file选项,选择settings, 找到界面中的Project Interpreter 或者 Python interpreter,点击““号&#xf…

2023 年诺贝尔奖花落谁家?

文章目录 2023 年诺贝尔奖,花落谁家?2023年诺贝尔经济学奖2023年诺贝尔和平奖2023年诺贝尔文学奖2023年诺贝尔化学奖2023年诺贝尔物理学奖2023年诺贝尔生理学/医学奖 2023 年诺贝尔奖,花落谁家? 2023年诺贝尔奖于10月2日至9日陆续…

淘宝开放平台 API 获取淘宝天猫店铺订单接口

业务场景:作为全球最大的 B2C 电子商务平台之一,淘宝(天猫)平台提供了丰富的商品资源,吸引了大量的全球买家和卖家。为了方便开发者接入淘宝平台,淘宝平台提供了丰富的 API 接口,其中商品详情接…

Linux-Jconsole连接远程服务器

Jconsole连接远程服务器 一、修改jmxremote.password.template文件二、启动jar项目三、jconsole远程连接1、打开的你jconsole2、远程连接 一、修改jmxremote.password.template文件 进去你的/idk/jre/lib/management目录下可以看到jmxremote.password.template文件 修改jmxr…

23.项目开发之量化交易抓取数据QuantTradeData(二)

后端业务:定时更新“A股日线行情”数据 需求说明 为了获取前一天的最新数据,我们需要每天晚上10点定时刷新daily股票列表基础信息,并将最新数据插入或更新到数据库中。 如果该内容是在当天交易日信息未更新前查询(15~16点之前&a…

NAT网关在阿里云的应用

NAT网关(Network Address Translation Gateway)是一种网络地址转换服务,提供NAT代理(SNAT和DNAT)能力。NAT是用于在本地网络中使用私有地址,在连接互联网时转而使用全局 IP 地址的技术。NAT实际上是为解决I…

kubernetes 多集群管理和联邦集群将是下一波运维浪潮

问题 调研一下国内外K8s平台软件,哪个具有创建标准的K8s集群的功能? 背景 随着云原生技术在越来越多的企业和组织中的大规模落地,如何高效、可靠地管理大规模资源池以应对不断增长的业务挑战成为了当下云原生技术的关键挑战。在过去的很长…

JAVA基础(JAVA SE)学习笔记(四)IDEA安装、使用、设置、断点、乱码汇总

前言 1. 学习视频: 尚硅谷Java零基础全套视频教程(宋红康2023版,java入门自学必备)_哔哩哔哩_bilibili 2023最新Java学习路线 - 哔哩哔哩 正文 JAVA基础(JAVA SE)学习笔记(一)JAVA学习路线、行业了解…

数据结构与算法之图: Leetcode 65. 有效数字 (Typescript版)

有效数字 https://leetcode.cn/problems/valid-number/ 描述 有效数字(按顺序)可以分成以下几个部分: 一个 小数 或者 整数(可选)一个 ‘e’ 或 ‘E’ ,后面跟着一个 整数 小数(按顺序&#…