中文语音识别转文字的王者,阿里达摩院FunAsr足可与Whisper相颉顽
君不言语音识别技术则已,言则必称Whisper,没错,OpenAi开源的Whisper确实是世界主流语音识别技术的魁首,但在中文领域,有一个足以和Whisper相颉顽的项目,那就是阿里达摩院自研的FunAsr。
FunAsr主要依托达摩院发布的Paraformer非自回归端到端语音识别模型,它具有高精度、高效率、便捷部署的优点,支持快速构建语音识别服务,最重要的是,FunASR支持标点符号识别、低语音识别、音频-视觉语音识别等功能,也就是说,它不仅可以实现语音转写,还能在转写后进行标注,一石二鸟。
FunAsr和Whisper对比 Medium vs speech_paraformer
首先配置好Python3.10的开发环境,随后在终端运行命令:
pip3 install torch torchaudio
pip3 intall funasr
pip3 install modelscope
随后编写测试脚本,这里以Bert-vits2里面的转写环节为例子,我们知道,如果想要克隆一个人的声音,那么必须首先把克隆对象的语音转写为文字,并且标注,标注的意义在于可以增强克隆语音的语气韵律问题。
首先看看whisper是怎么做的:
def transcribe_one(audio_path):
model = whisper.load_model("medium")
# load audio and pad/trim it to fit 30 seconds
audio = whisper.load_audio(audio_path)
audio = whisper.pad_or_trim(audio)
# make log-Mel spectrogram and move to the same device as the model
mel = whisper.log_mel_spectrogram(audio).to(model.device)
# detect the spoken language
_, probs = model.detect_language(mel)
print(f"Detected language: {max(probs, key=probs.get)}")
lang = max(probs, key=probs.get)
# decode the audio
options = whisper.DecodingOptions(beam_size=5)
result = whisper.decode(model, mel, options)
# print the recognized text
print(result.text)
return lang, result.text
这通过Whisper的gpu模式来进行推理,模型选择medium,硬件要求是最低6G显存,更多关于whisper的配置,请移步:闻其声而知雅意,M1 Mac基于PyTorch(mps/cpu/cuda)的人工智能AI本地语音识别库Whisper(Python3.10),这里不再赘述。
Whisper转写后效果:
./Data\Keira\wavs\Keira_0.wav|Keira|ZH|光动嘴不如亲自做给你看
./Data\Keira\wavs\Keira_1.wav|Keira|ZH|等我一下呀迫不及待了嘛
./Data\Keira\wavs\Keira_10.wav|Keira|ZH|你还会帮我吗真没想到你对葡萄酒也这么内行啊
./Data\Keira\wavs\Keira_11.wav|Keira|ZH|差不多吧好了 聊了这么久我都饿了
./Data\Keira\wavs\Keira_12.wav|Keira|ZH|还是赶紧开动吧我自己能应付
./Data\Keira\wavs\Keira_13.wav|Keira|ZH|这些蛋啊 鸡啊 鹅啊 满地都是
./Data\Keira\wavs\Keira_14.wav|Keira|ZH|再说我的经济状况很快就要改善了
./Data\Keira\wavs\Keira_15.wav|Keira|ZH|因为我很清楚他的研究有多重要
./Data\Keira\wavs\Keira_16.wav|Keira|ZH|万一落入心怀不轨的人手里结果不堪设想
./Data\Keira\wavs\Keira_17.wav|Keira|ZH|再後悔也晚了
./Data\Keira\wavs\Keira_18.wav|Keira|ZH|抱歉这话题太丧气了
./Data\Keira\wavs\Keira_19.wav|Keira|ZH|我不應該提起來煞風景的
./Data\Keira\wavs\Keira_2.wav|Keira|ZH|現在還不是時候
./Data\Keira\wavs\Keira_20.wav|Keira|ZH|尤其是在我們的浪漫晚餐上
./Data\Keira\wavs\Keira_21.wav|Keira|ZH|你知道森瑞卡尼亚人管那个星座叫什么吗
./Data\Keira\wavs\Keira_22.wav|Keira|ZH|不對哦是個含義完全不一樣的名字
./Data\Keira\wavs\Keira_23.wav|Keira|ZH|事实上有点下流
./Data\Keira\wavs\Keira_24.wav|Keira|ZH|靠近一点我悄悄告诉你
./Data\Keira\wavs\Keira_3.wav|Keira|ZH|好了,趕緊出去
./Data\Keira\wavs\Keira_4.wav|Keira|ZH|你还挺乖的嘛现在差不多准备好了
./Data\Keira\wavs\Keira_5.wav|Keira|ZH|我不是說差不多好了嗎
./Data\Keira\wavs\Keira_6.wav|Keira|ZH|别打岔 看仔细了
./Data\Keira\wavs\Keira_7.wav|Keira|ZH|那是没错但那样我就不会把你请到这儿来了
./Data\Keira\wavs\Keira_8.wav|Keira|ZH|现在明白我为什么要那些材料了吧
./Data\Keira\wavs\Keira_9.wav|Keira|ZH|如果我说 去树林里帮我取些食材 我要做晚餐
可以看到,medium模型对于中文的泛化效果一般,大多数素材都没有标注,但仅限于Whisper的medium模型。
现在我们来看看阿里的FunAsr:
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
from modelscope.hub.snapshot_download import snapshot_download
# 指定本地目录
local_dir_root = "./models_from_modelscope"
model_dir = snapshot_download('damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch', cache_dir=local_dir_root)
inference_pipeline = pipeline(
task=Tasks.auto_speech_recognition,
model=model_dir,
vad_model='damo/speech_fsmn_vad_zh-cn-16k-common-pytorch',
punc_model='damo/punc_ct-transformer_zh-cn-common-vocab272727-pytorch',
#lm_model='damo/speech_transformer_lm_zh-cn-common-vocab8404-pytorch',
#lm_weight=0.15,
#beam_size=10,
)
param_dict = {}
param_dict['use_timestamp'] = False
这里首先指定模型目录,否则FunAsr会在C盘下载模型。
随后编写转写逻辑:
def transcribe_one(audio_path):
rec_result = inference_pipeline(audio_in=audio_path, param_dict=param_dict)
print(rec_result["text"])
return "zh", rec_result["text"]
转写后效果:
./Data\Keira\wavs\Keira_0.wav|Keira|ZH|光动嘴不如亲自做给你看。
./Data\Keira\wavs\Keira_1.wav|Keira|ZH|等我一下呀,迫不及待了吗?
./Data\Keira\wavs\Keira_10.wav|Keira|ZH|你还会帮我吗?真没想到你对葡萄酒也这么内行啊。
./Data\Keira\wavs\Keira_11.wav|Keira|ZH|差不多吧。好了,聊了这么久,我都饿了。
./Data\Keira\wavs\Keira_12.wav|Keira|ZH|还是赶紧开动吧,我自己能应付。
./Data\Keira\wavs\Keira_13.wav|Keira|ZH|这些蛋啊、鸡啊、鹅啊的满地都是。
./Data\Keira\wavs\Keira_14.wav|Keira|ZH|再说我的经济状况很快就要改善了。
./Data\Keira\wavs\Keira_15.wav|Keira|ZH|因为我很清楚他的研究有多重要。
./Data\Keira\wavs\Keira_16.wav|Keira|ZH|万一落入心怀不轨的人,手里,结果不堪设想。
./Data\Keira\wavs\Keira_17.wav|Keira|ZH|再后悔也晚了。
./Data\Keira\wavs\Keira_18.wav|Keira|ZH|哎呀,抱歉,这话题太丧气了。
./Data\Keira\wavs\Keira_19.wav|Keira|ZH|我不应该提起来煞风景的。
./Data\Keira\wavs\Keira_2.wav|Keira|ZH|现在还不是时候。
./Data\Keira\wavs\Keira_20.wav|Keira|ZH|尤其是在我们的浪漫晚餐上。
./Data\Keira\wavs\Keira_21.wav|Keira|ZH|你知道瑟瑞卡尼亚人管那个星座叫什么吗?
./Data\Keira\wavs\Keira_22.wav|Keira|ZH|不对哦,是个含义,完全不一样的名字。
./Data\Keira\wavs\Keira_23.wav|Keira|ZH|事实上有点下流。
./Data\Keira\wavs\Keira_24.wav|Keira|ZH|靠近一点儿,我悄悄告诉你。
./Data\Keira\wavs\Keira_3.wav|Keira|ZH|好了,赶紧出去。
./Data\Keira\wavs\Keira_4.wav|Keira|ZH|你还挺乖的嘛,现在差不多准备好了。
./Data\Keira\wavs\Keira_5.wav|Keira|ZH|我不是说差不多好了吗?
./Data\Keira\wavs\Keira_6.wav|Keira|ZH|别打岔看仔细了。
./Data\Keira\wavs\Keira_7.wav|Keira|ZH|那是没错,但那样我就不会把你请到这儿来了。
./Data\Keira\wavs\Keira_8.wav|Keira|ZH|现在明白我为什么要那些材料了吧。
./Data\Keira\wavs\Keira_9.wav|Keira|ZH|如果我说去树林里帮我取些食材,我要做晚餐。
可以看到,几乎不需要修改,而且每一条素材都进行了标注。
对比图如下:
FunAsr和Whisper对比 Large-v2 & Large-v3 vs speech_paraformer
当然,Medium并非whisper的最高水平,现在我们来换成大模型:
def transcribe_one(audio_path):
model = whisper.load_model("large-v2")
# load audio and pad/trim it to fit 30 seconds
audio = whisper.load_audio(audio_path)
audio = whisper.pad_or_trim(audio)
# make log-Mel spectrogram and move to the same device as the model
mel = whisper.log_mel_spectrogram(audio).to(model.device)
# detect the spoken language
_, probs = model.detect_language(mel)
print(f"Detected language: {max(probs, key=probs.get)}")
lang = max(probs, key=probs.get)
# decode the audio
options = whisper.DecodingOptions(beam_size=5)
result = whisper.decode(model, mel, options)
# print the recognized text
print(result.text)
return lang, result.text
返回结果:
./Data\Keira\wavs\Keira_0.wav|Keira|ZH|光动嘴不如亲自做给你看
./Data\Keira\wavs\Keira_1.wav|Keira|ZH|等我一下呀迫不及待了嘛
./Data\Keira\wavs\Keira_10.wav|Keira|ZH|你还会帮我吗真没想到你对葡萄酒也这么内行啊
./Data\Keira\wavs\Keira_11.wav|Keira|ZH|差不多吧好了 聊了这么久我都饿了
./Data\Keira\wavs\Keira_12.wav|Keira|ZH|还是赶紧开动吧我自己能应付
./Data\Keira\wavs\Keira_13.wav|Keira|ZH|这些蛋啊 鸡啊 鹅啊 满地都是
./Data\Keira\wavs\Keira_14.wav|Keira|ZH|再说我的经济状况很快就要改善了
./Data\Keira\wavs\Keira_15.wav|Keira|ZH|因为我很清楚他的研究有多重要
./Data\Keira\wavs\Keira_16.wav|Keira|ZH|万一落入心怀不轨的人手里结果不堪设想
./Data\Keira\wavs\Keira_17.wav|Keira|ZH|再後悔也晚了
./Data\Keira\wavs\Keira_18.wav|Keira|ZH|抱歉这话题太丧气了
./Data\Keira\wavs\Keira_19.wav|Keira|ZH|我不應該提起來煞風景的
./Data\Keira\wavs\Keira_2.wav|Keira|ZH|現在還不是時候
./Data\Keira\wavs\Keira_20.wav|Keira|ZH|尤其是在我們的浪漫晚餐上
./Data\Keira\wavs\Keira_21.wav|Keira|ZH|你知道森瑞卡尼亚人管那个星座叫什么吗
./Data\Keira\wavs\Keira_22.wav|Keira|ZH|不對哦是個含義完全不一樣的名字
./Data\Keira\wavs\Keira_23.wav|Keira|ZH|事实上有点下流
./Data\Keira\wavs\Keira_24.wav|Keira|ZH|靠近一点我悄悄告诉你
./Data\Keira\wavs\Keira_3.wav|Keira|ZH|好了,趕緊出去
./Data\Keira\wavs\Keira_4.wav|Keira|ZH|你还挺乖的嘛现在差不多准备好了
./Data\Keira\wavs\Keira_5.wav|Keira|ZH|我不是說差不多好了嗎
./Data\Keira\wavs\Keira_6.wav|Keira|ZH|别打岔 看仔细了
./Data\Keira\wavs\Keira_7.wav|Keira|ZH|那是没错但那样我就不会把你请到这儿来了
./Data\Keira\wavs\Keira_8.wav|Keira|ZH|现在明白我为什么要那些材料了吧
./Data\Keira\wavs\Keira_9.wav|Keira|ZH|如果我说 去树林里帮我取些食材 我要做晚餐
整体上的偏差并不大,但标注上略逊FunAsr一筹。
结语
Funasr的模型paraformer-zh受益于60000小时的纯人工标注的数据来训练,中文参数达到220M个,它的两个模块,一个是基于前馈顺序记忆网络(FSMN-VAD)的语音活动检测模型,另外一个是基于可控时延 Transformer(CT-Transformer),相比 OpenAI 的 Whisper 这两块能力还是比较突出的。
很难想象6w小时的数据还是纯手工标注,毕竟阿里财大气粗。
而Whisper 则用了 68w 小时的数据,从这个层面来看,FunASR 似乎没占便宜。但Whisper 针对的是全球市场,68w小时里面有多少中文素材就很难说了,因此 FunASR 的中文语音转写效果确实比 Whisper 更优秀。
中文语音识别转文字的王者,阿里达摩院FunAsr足可与Whisper相颉顽的更多相关文章
- CVPR2020| 阿里达摩院最新力作SA-SSD
作者:蒋天园 Date:2020-04-16 来源:SA-SSD:阿里达摩院最新3D检测力作(CVPR2020) Brief 来自CVPR2020的研究工作,也是仅仅使用Lidar数据进行3D检测的文 ...
- 阿里云在云栖大会发布RPA最新3.4版本,将与达摩院联合探索人工智能领域
9月26日,在2019年杭州云栖大会上,阿里云发布了RPA最新V3.4版本,全新升级了增加诸如录屏审计.JAVA应用录制能力.达摩院OCR内置组件.语法检查与智能提示能力增强等功能. RPA全名称Ro ...
- 基于深度学习的中文语音识别系统框架(pluse)
目录 声学模型 GRU-CTC DFCNN DFSMN 语言模型 n-gram CBHG 数据集 本文搭建一个完整的中文语音识别系统,包括声学模型和语言模型,能够将输入的音频信号识别为汉字. 声学模型 ...
- GRU-CTC中文语音识别
目录 基于keras的中文语音识别 音频文件特征提取 文本数据处理 数据格式处理 构建模型 模型训练及解码 aishell数据转化 该项目github地址 基于keras的中文语音识别 该项目实现了G ...
- TOP100summit 2017:投资千亿成立达摩院,揭秘阿里在人工智能领域的探索
今天上午,阿里巴巴云栖大会在杭州开幕,第一条重磅消息是阿里首席技术官张建锋宣布成立达摩院,在全球各地建立实验室,3年内投入千亿在全球建立实验室.和高校建立研究所.建立全球研究中心等事务. 该院由全球实 ...
- word中怎样把文档里的中文以及中文字符全选?
word中怎样把文档里的中文以及中文字符全选? 参考: 百度 案例: 有个文档是中英文混杂的 现在需要把中文以及中文字符全部设置成别的颜色 应该怎样操作? 有80多页 别说让我一个一个的设置 以wor ...
- 邀您共赴数据库学术顶会ICDE 2019——阿里云专场 零距离接触达摩院数据库“最强大脑”
摘要: 当学术大家遇到技术大拿,会碰撞出怎样的火花?为进一步加深产学研学术交流,阿里云将于ICDE 2019大会期间(4月9日)举办以“云时代的数据库”为主题的技术专场(Workshop) 作为全球数 ...
- 阿里开源新一代 AI 算法模型,由达摩院90后科学家研发
最炫的技术新知.最热门的大咖公开课.最有趣的开发者活动.最实用的工具干货,就在<开发者必读>! 每日集成开发者社区精品内容,你身边的技术资讯管家. 每日头条 阿里开源新一代 AI 算法模型 ...
- python使用vosk进行中文语音识别
操作系统:Windows10 Python版本:3.9.2 vosk是一个离线开源语音识别工具,它可以识别16种语言,包括中文. 这里记录下使用vosk进行中文识别的过程,以便后续查阅. vosk地址 ...
- C# 语音识别(文字to语音、语音to文字)
最近打算研究一下语音识别,但是发现网上很少有C#的完整代码,就把自己的学习心得放上来,和大家分享一下. 下载API: 1)SpeechSDK51.exe (67.0 ...
随机推荐
- 文心一言 VS 讯飞星火 VS chatgpt (101)-- 算法导论9.3 7题
七.用go语言,设计一个 O(n)时间的算法,对于一个给定的包含n个互异元素的集合 S 和一个正整数k≤n,该算法能够确定 S 中最接近中位数的k个元素. 文心一言: 要设计一个 O(n) 时间的算法 ...
- Python socket实现ftp文件下载服务
简要 使用Python socket和多线程实现一个FTP服务下载.下面的示例是固定下载某一个任意格式文件. 仅仅为了展示如果使用socket和多线程进行文件下载 服务端代码 import socke ...
- OpenSSL 生成 RootCA (根证书)并自签署证书(支持 IP 地址)
背景 某机房内部访问需要配置 HTTPS,网上找的一些证书教程都不是特别好,有些直接生成证书,没有根 CA 的证书导致信任不了 Ubuntu 机器,有些教程只有域名生成,没有 IP 生成,有些甚至报错 ...
- Go 函数的健壮性、panic异常处理、defer 机制
Go 函数的健壮性.panic异常处理.defer 机制 目录 Go 函数的健壮性.panic异常处理.defer 机制 一.函数健壮性的"三不要"原则 1.1 原则一:不要相信任 ...
- 文心一言 VS 讯飞星火 VS chatgpt (123)-- 算法导论10.4 4题
四.用go语言,对于一个含 n个结点的任意有根树,写出一个 O(n)时间的过程,输出其所有关键字该树以左孩子右兄弟表示法存储. 文心一言: 在计算机科学中,左孩子右兄弟表示法是一种用于表示树状结构的方 ...
- Java开发中的工作流程和步骤
前言 随着环境的变迁,大家总会更换工作,有裁员的,有跳槽的,除了进进出出的老人,还有源源不断入坑的新人. 很多人入职之后还不知道怎么快速适应工作,对我而言,除去寥寥可数的同事感情,对我而言,更换工作更 ...
- 聊聊魔塔社区MGeo模型的部署与运行
从现今与今后的发展来看,单一的业务不再仅仅依靠于传统的技术开发,而是应该结合AI模型来应用.实践.只有这样,才能更数智化,更高效化,更贴合时代的发展. 魔塔 社区就类似国外的Hugging Face, ...
- AtCoder Beginner Contest 237 G - Range Sort Query
原题链接 G - Range Sort Query 思路: \(x\)是固定的,所以考虑将排序维护成0 1串,为\(p_i < x\)为\(0\),那么\(p_i \geq x\)为\(1\), ...
- 每天5分钟复习OpenStack(十)Ceph 架构
在很多关于Ceph的文章中,通常会介绍一堆概念.虽然这些概念很重要,但是对于一个新手来说,同时接受太多的概念实际上很难消化.因此,在阅读本章节时要保持轻松的心情,只需要对所有的概念有个了解就可以了,因 ...
- 【ASP.NET Core】MVC过滤器:运行流程
MVC 的过滤器(Filters)也翻译为"筛选器".但是老周更喜欢翻译为"过滤器",意思上更好理解. 既然都叫过滤器了,就是在MVC的操作方法调用前后进行特殊 ...