君不言語音識別技術則已,言則必稱Whisper,沒錯,OpenAi開源的Whisper確實是世界主流語音識別技術的魁首,但在中文領域,有一個足以和Whisper相頡頑的項目,那就是阿里達摩院自研的FunAsr。
FunAsr主要依托達摩院發(fā)布的Paraformer非自回歸端到端語音識別模型,它具有高精度、高效率、便捷部署的優(yōu)點,支持快速構建語音識別服務,最重要的是,FunASR支持標點符號識別、低語音識別、音頻-視覺語音識別等功能,也就是說,它不僅可以實現語音轉寫,還能在轉寫后進行標注,一石二鳥。
FunAsr和Whisper對比 Medium vs speech_paraformer
首先配置好Python3.10的開發(fā)環(huán)境,隨后在終端運行命令:
pip3 install torch torchaudio
pip3 intall funasr
pip3 install modelscope
隨后編寫測試腳本,這里以Bert-vits2里面的轉寫環(huán)節(jié)為例子,我們知道,如果想要克隆一個人的聲音,那么必須首先把克隆對象的語音轉寫為文字,并且標注,標注的意義在于可以增強克隆語音的語氣韻律問題。
首先看看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小時的數據還是純手工標注,畢竟阿里財大氣粗。文章來源:http://www.zghlxwxcb.cn/news/detail-778667.html
而Whisper 則用了 68w 小時的數據,從這個層面來看,FunASR 似乎沒占便宜。但Whisper 針對的是全球市場,68w小時里面有多少中文素材就很難說了,因此 FunASR 的中文語音轉寫效果確實比 Whisper 更優(yōu)秀。文章來源地址http://www.zghlxwxcb.cn/news/detail-778667.html
到了這里,關于中文語音識別轉文字的王者,阿里達摩院FunAsr足可與Whisper相頡頑的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!