中文语音辨认转笔墨的王者,阿里达摩院FunAsr足可与Whisper相颉顽

[复制链接]
发表于 2026-2-23 08:55:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

君不言语音辨认技能则已,言则必称Whisper,没错,OpenAi开源的Whisper确实是天下主流语音辨认技能的魁首,但在中文范畴,有一个足以和Whisper相颉顽的项目,那就是阿里达摩院自研的FunAsr。
FunAsr告急依托达摩院发布的Paraformer非自回归端到端语音辨认模子,它具有高精度、高服从、便捷摆设的长处,支持快速构建语音辨认服务,最告急的是,FunASR支持标点符号辨认、低语音辨认、音频-视觉语音辨认等功能,也就是说,它不光可以实现语音转写,还能在转写后举行标注,一石二鸟。
FunAsr和Whisper对比 Medium vs speech_paraformer

起首设置好Python3.10的开发情况,随后在终端运行下令:
  1. pip3 install torch torchaudio  
  2. pip3 intall funasr  
  3. pip3 install modelscope
复制代码
随后编写测试脚本,这里以Bert-vits2内里的转写环节为例子,我们知道,假如想要克隆一个人的声音,那么必须起首把克隆对象的语音转写为笔墨,而且标注,标注的意义在于可以加强克隆语音的语气韵律题目。
起首看看whisper是怎么做的:
  1. def transcribe_one(audio_path):
  2.     model = whisper.load_model("medium")  
  3.     # load audio and pad/trim it to fit 30 seconds  
  4.     audio = whisper.load_audio(audio_path)  
  5.     audio = whisper.pad_or_trim(audio)  
  6.   
  7.     # make log-Mel spectrogram and move to the same device as the model  
  8.     mel = whisper.log_mel_spectrogram(audio).to(model.device)  
  9.   
  10.     # detect the spoken language  
  11.     _, probs = model.detect_language(mel)  
  12.     print(f"Detected language: {max(probs, key=probs.get)}")  
  13.     lang = max(probs, key=probs.get)  
  14.     # decode the audio  
  15.     options = whisper.DecodingOptions(beam_size=5)  
  16.     result = whisper.decode(model, mel, options)  
  17.   
  18.     # print the recognized text  
  19.     print(result.text)  
  20.     return lang, result.text
复制代码
这通过Whisper的gpu模式来举行推理,模子选择medium,硬件要求是最低6G显存,更多关于whisper的设置,请移步:闻其声而知雅意,M1 Mac基于PyTorch(mps/cpu/cuda)的人工智能AI当地语音辨认库Whisper(Python3.10),这里不再赘述。
Whisper转写后效果:
  1. ./Data\Keira\wavs\Keira_0.wav|Keira|ZH|光动嘴不如亲自做给你看  
  2. ./Data\Keira\wavs\Keira_1.wav|Keira|ZH|等我一下呀迫不及待了嘛  
  3. ./Data\Keira\wavs\Keira_10.wav|Keira|ZH|你还会帮我吗真没想到你对葡萄酒也这么内行啊  
  4. ./Data\Keira\wavs\Keira_11.wav|Keira|ZH|差不多吧好了 聊了这么久我都饿了  
  5. ./Data\Keira\wavs\Keira_12.wav|Keira|ZH|还是赶紧开动吧我自己能应付  
  6. ./Data\Keira\wavs\Keira_13.wav|Keira|ZH|这些蛋啊 鸡啊 鹅啊 满地都是  
  7. ./Data\Keira\wavs\Keira_14.wav|Keira|ZH|再说我的经济状况很快就要改善了  
  8. ./Data\Keira\wavs\Keira_15.wav|Keira|ZH|因为我很清楚他的研究有多重要  
  9. ./Data\Keira\wavs\Keira_16.wav|Keira|ZH|万一落入心怀不轨的人手里结果不堪设想  
  10. ./Data\Keira\wavs\Keira_17.wav|Keira|ZH|再後悔也晚了  
  11. ./Data\Keira\wavs\Keira_18.wav|Keira|ZH|抱歉这话题太丧气了  
  12. ./Data\Keira\wavs\Keira_19.wav|Keira|ZH|我不應該提起來煞風景的  
  13. ./Data\Keira\wavs\Keira_2.wav|Keira|ZH|現在還不是時候  
  14. ./Data\Keira\wavs\Keira_20.wav|Keira|ZH|尤其是在我們的浪漫晚餐上  
  15. ./Data\Keira\wavs\Keira_21.wav|Keira|ZH|你知道森瑞卡尼亚人管那个星座叫什么吗  
  16. ./Data\Keira\wavs\Keira_22.wav|Keira|ZH|不對哦是個含義完全不一樣的名字  
  17. ./Data\Keira\wavs\Keira_23.wav|Keira|ZH|事实上有点下流  
  18. ./Data\Keira\wavs\Keira_24.wav|Keira|ZH|靠近一点我悄悄告诉你  
  19. ./Data\Keira\wavs\Keira_3.wav|Keira|ZH|好了,趕緊出去  
  20. ./Data\Keira\wavs\Keira_4.wav|Keira|ZH|你还挺乖的嘛现在差不多准备好了  
  21. ./Data\Keira\wavs\Keira_5.wav|Keira|ZH|我不是說差不多好了嗎  
  22. ./Data\Keira\wavs\Keira_6.wav|Keira|ZH|别打岔 看仔细了  
  23. ./Data\Keira\wavs\Keira_7.wav|Keira|ZH|那是没错但那样我就不会把你请到这儿来了  
  24. ./Data\Keira\wavs\Keira_8.wav|Keira|ZH|现在明白我为什么要那些材料了吧  
  25. ./Data\Keira\wavs\Keira_9.wav|Keira|ZH|如果我说 去树林里帮我取些食材 我要做晚餐
复制代码
可以看到,medium模子对于中文的泛化效果一样平常,大多数素材都没有标注,但仅限于Whisper的medium模子。
现在我们来看看阿里的FunAsr:
  1. from modelscope.pipelines import pipeline  
  2. from modelscope.utils.constant import Tasks  
  3.   
  4.   
  5.   
  6. from modelscope.hub.snapshot_download import snapshot_download  
  7.   
  8. # 指定本地目录  
  9. local_dir_root = "./models_from_modelscope"  
  10. model_dir = snapshot_download('damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch', cache_dir=local_dir_root)  
  11.   
  12. inference_pipeline = pipeline(  
  13.     task=Tasks.auto_speech_recognition,  
  14.     model=model_dir,  
  15.     vad_model='damo/speech_fsmn_vad_zh-cn-16k-common-pytorch',  
  16.     punc_model='damo/punc_ct-transformer_zh-cn-common-vocab272727-pytorch',  
  17.     #lm_model='damo/speech_transformer_lm_zh-cn-common-vocab8404-pytorch',  
  18.     #lm_weight=0.15,  
  19.     #beam_size=10,  
  20. )  
  21. param_dict = {}  
  22. param_dict['use_timestamp'] = False
复制代码
这里起首指定模子目次,否则FunAsr会在C盘下载模子。
随后编写转写逻辑:
  1. def transcribe_one(audio_path):  
  2.       
  3.     rec_result = inference_pipeline(audio_in=audio_path, param_dict=param_dict)  
  4.   
  5.     print(rec_result["text"])  
  6.   
  7.     return "zh", rec_result["text"]
复制代码
转写后效果:
  1. ./Data\Keira\wavs\Keira_0.wav|Keira|ZH|光动嘴不如亲自做给你看。  
  2. ./Data\Keira\wavs\Keira_1.wav|Keira|ZH|等我一下呀,迫不及待了吗?  
  3. ./Data\Keira\wavs\Keira_10.wav|Keira|ZH|你还会帮我吗?真没想到你对葡萄酒也这么内行啊。  
  4. ./Data\Keira\wavs\Keira_11.wav|Keira|ZH|差不多吧。好了,聊了这么久,我都饿了。  
  5. ./Data\Keira\wavs\Keira_12.wav|Keira|ZH|还是赶紧开动吧,我自己能应付。  
  6. ./Data\Keira\wavs\Keira_13.wav|Keira|ZH|这些蛋啊、鸡啊、鹅啊的满地都是。  
  7. ./Data\Keira\wavs\Keira_14.wav|Keira|ZH|再说我的经济状况很快就要改善了。  
  8. ./Data\Keira\wavs\Keira_15.wav|Keira|ZH|因为我很清楚他的研究有多重要。  
  9. ./Data\Keira\wavs\Keira_16.wav|Keira|ZH|万一落入心怀不轨的人,手里,结果不堪设想。  
  10. ./Data\Keira\wavs\Keira_17.wav|Keira|ZH|再后悔也晚了。  
  11. ./Data\Keira\wavs\Keira_18.wav|Keira|ZH|哎呀,抱歉,这话题太丧气了。  
  12. ./Data\Keira\wavs\Keira_19.wav|Keira|ZH|我不应该提起来煞风景的。  
  13. ./Data\Keira\wavs\Keira_2.wav|Keira|ZH|现在还不是时候。  
  14. ./Data\Keira\wavs\Keira_20.wav|Keira|ZH|尤其是在我们的浪漫晚餐上。  
  15. ./Data\Keira\wavs\Keira_21.wav|Keira|ZH|你知道瑟瑞卡尼亚人管那个星座叫什么吗?  
  16. ./Data\Keira\wavs\Keira_22.wav|Keira|ZH|不对哦,是个含义,完全不一样的名字。  
  17. ./Data\Keira\wavs\Keira_23.wav|Keira|ZH|事实上有点下流。  
  18. ./Data\Keira\wavs\Keira_24.wav|Keira|ZH|靠近一点儿,我悄悄告诉你。  
  19. ./Data\Keira\wavs\Keira_3.wav|Keira|ZH|好了,赶紧出去。  
  20. ./Data\Keira\wavs\Keira_4.wav|Keira|ZH|你还挺乖的嘛,现在差不多准备好了。  
  21. ./Data\Keira\wavs\Keira_5.wav|Keira|ZH|我不是说差不多好了吗?  
  22. ./Data\Keira\wavs\Keira_6.wav|Keira|ZH|别打岔看仔细了。  
  23. ./Data\Keira\wavs\Keira_7.wav|Keira|ZH|那是没错,但那样我就不会把你请到这儿来了。  
  24. ./Data\Keira\wavs\Keira_8.wav|Keira|ZH|现在明白我为什么要那些材料了吧。  
  25. ./Data\Keira\wavs\Keira_9.wav|Keira|ZH|如果我说去树林里帮我取些食材,我要做晚餐。
复制代码
可以看到,险些不须要修改,而且每一条素材都举行了标注。
对比图如下:

FunAsr和Whisper对比 Large-v2 & Large-v3 vs speech_paraformer

固然,Medium并非whisper的最高程度,现在我们来换成大模子:
  1. def transcribe_one(audio_path):  
  2.     model = whisper.load_model("large-v2")  
  3.   
  4.     # load audio and pad/trim it to fit 30 seconds  
  5.     audio = whisper.load_audio(audio_path)  
  6.     audio = whisper.pad_or_trim(audio)  
  7.   
  8.     # make log-Mel spectrogram and move to the same device as the model  
  9.     mel = whisper.log_mel_spectrogram(audio).to(model.device)  
  10.   
  11.     # detect the spoken language  
  12.     _, probs = model.detect_language(mel)  
  13.     print(f"Detected language: {max(probs, key=probs.get)}")  
  14.     lang = max(probs, key=probs.get)  
  15.     # decode the audio  
  16.     options = whisper.DecodingOptions(beam_size=5)  
  17.     result = whisper.decode(model, mel, options)  
  18.   
  19.     # print the recognized text  
  20.     print(result.text)  
  21.     return lang, result.text
复制代码
返回效果:
  1. ./Data\Keira\wavs\Keira_0.wav|Keira|ZH|光动嘴不如亲自做给你看  
  2. ./Data\Keira\wavs\Keira_1.wav|Keira|ZH|等我一下呀迫不及待了嘛  
  3. ./Data\Keira\wavs\Keira_10.wav|Keira|ZH|你还会帮我吗真没想到你对葡萄酒也这么内行啊  
  4. ./Data\Keira\wavs\Keira_11.wav|Keira|ZH|差不多吧好了 聊了这么久我都饿了  
  5. ./Data\Keira\wavs\Keira_12.wav|Keira|ZH|还是赶紧开动吧我自己能应付  
  6. ./Data\Keira\wavs\Keira_13.wav|Keira|ZH|这些蛋啊 鸡啊 鹅啊 满地都是  
  7. ./Data\Keira\wavs\Keira_14.wav|Keira|ZH|再说我的经济状况很快就要改善了  
  8. ./Data\Keira\wavs\Keira_15.wav|Keira|ZH|因为我很清楚他的研究有多重要  
  9. ./Data\Keira\wavs\Keira_16.wav|Keira|ZH|万一落入心怀不轨的人手里结果不堪设想  
  10. ./Data\Keira\wavs\Keira_17.wav|Keira|ZH|再後悔也晚了  
  11. ./Data\Keira\wavs\Keira_18.wav|Keira|ZH|抱歉这话题太丧气了  
  12. ./Data\Keira\wavs\Keira_19.wav|Keira|ZH|我不應該提起來煞風景的  
  13. ./Data\Keira\wavs\Keira_2.wav|Keira|ZH|現在還不是時候  
  14. ./Data\Keira\wavs\Keira_20.wav|Keira|ZH|尤其是在我們的浪漫晚餐上  
  15. ./Data\Keira\wavs\Keira_21.wav|Keira|ZH|你知道森瑞卡尼亚人管那个星座叫什么吗  
  16. ./Data\Keira\wavs\Keira_22.wav|Keira|ZH|不對哦是個含義完全不一樣的名字  
  17. ./Data\Keira\wavs\Keira_23.wav|Keira|ZH|事实上有点下流  
  18. ./Data\Keira\wavs\Keira_24.wav|Keira|ZH|靠近一点我悄悄告诉你  
  19. ./Data\Keira\wavs\Keira_3.wav|Keira|ZH|好了,趕緊出去  
  20. ./Data\Keira\wavs\Keira_4.wav|Keira|ZH|你还挺乖的嘛现在差不多准备好了  
  21. ./Data\Keira\wavs\Keira_5.wav|Keira|ZH|我不是說差不多好了嗎  
  22. ./Data\Keira\wavs\Keira_6.wav|Keira|ZH|别打岔 看仔细了  
  23. ./Data\Keira\wavs\Keira_7.wav|Keira|ZH|那是没错但那样我就不会把你请到这儿来了  
  24. ./Data\Keira\wavs\Keira_8.wav|Keira|ZH|现在明白我为什么要那些材料了吧  
  25. ./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 更良好。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表