概括
? ? ? ? 本文對WeNet聲音識別網(wǎng)絡(luò)的Python API上介紹的Non-Streaming Usage和 Streaming-Usage分別做了測試,兩者本質(zhì)相同。API對應(yīng)采樣的聲音幀率、聲道都做了限制。效果還可以,但是部分吐字不清晰、有歧義的地方仍然不能識別清晰。
項目地址:
GitHub - wenet-e2e/wenet: Production First and Production Ready End-to-End Speech Recognition Toolkit
安裝:
pip3 install wenetruntime
根據(jù)項目要求,python版本必須3.6+,這里為3.8.3, 因此沒有問題
應(yīng)用案例:
官方文檔上分為非流式和流式兩種,本次先演示非流式應(yīng)用:
非流式:
第一步:壓縮wav文件,根據(jù)測試,api使用wave庫打開文件。且僅支持單聲道、固定幀率。
import wave
with wave.open(wav_file, 'rb') as fin:
assert fin.getnchannels() == 1
assert fin.getsampwidth() == 2
assert fin.getframerate() == 16000
第二步:我準(zhǔn)備用來識別的《起風(fēng)了》wav格式顯然不符合要求,使用pydub來壓縮幀率、合并為單聲道。同時,文件太長也不行。例如全歌一起識別會報錯,因此我這里切割,每次取十分之一的歌詞內(nèi)容(約28秒的內(nèi)容)
# 壓縮文件
from pydub import AudioSegment
sound = AudioSegment.from_wav("/root/jupyterprojects/data/起風(fēng)了.wav")
# 雙聲道變?yōu)閱温暤?sound = sound.set_channels(1)
# 壓縮幀率
sound = sound.set_frame_rate(16000)
# 長度太長了可能會塞爆,每次取十分之一
musicLen = len(sound)
unitLen = musicLen / 10
for i in range(10):
_sound = sound[unitLen*i:unitLen*(i+1)]
_sound.export("/root/jupyterprojects/data/起風(fēng)了-sub%s.wav" % i, format="wav")
第三步:加載模型、識別。如果不提供model_dir參數(shù),則默認(rèn)會從github上下載。包比較大,建議提前下載好。
import sys
import torch
import wenetruntime as wenet
# 下載https://github.com/wenet-e2e/wenet/releases/download/v2.0.1/chs.tar.gz
# 并解壓縮到/root/.wenet/chs目錄下
decoder = wenet.Decoder(model_dir="/root/.wenet/chs/chs/",lang='chs')
第四步:識別。
decoder.decode_wav函數(shù)返回一個可以轉(zhuǎn)換為字典的字符串。
import glob
files = glob.glob("/root/jupyterprojects/data/起風(fēng)了-sub?.wav")
for idx,file in enumerate(files):
ans=eval(decoder.decode_wav(file))
print(idx,": ", ans["nbest"][0]["sentence"])
?正確的歌詞:
我曾將青春翻涌成她
也曾指尖彈出盛夏
心之所動 且就隨緣去吧這一路上走走停停
順著少年漂流的痕跡
邁出車站的前一刻
竟有些猶豫
不禁笑這近鄉(xiāng)情怯
仍無可避免
而長野的天
依舊那么暖
風(fēng)吹起了從前
從前初識這世間萬般流連
看著天邊似在眼前
也甘愿赴湯蹈火去走它一遍
如今走過這世間
萬般流連
翻過歲月不同側(cè)臉
措不及防闖入你的笑顏
我曾難自拔于世界之大
也沉溺于其中夢話
不得真假 不做掙扎 不懼笑話
我曾將青春翻涌成她
也曾指尖彈出盛夏
心之所動 且就隨緣去吧
逆著光行走 任風(fēng)吹雨打
短短的路走走停停
也有了幾分的距離
不知撫摸的是故事 還是段心情
也許期待的不過是 與時間為敵
再次看到你
微涼晨光里
笑得很甜蜜
從前初識這世間
萬般流連
看著天邊似在眼前
也甘愿赴湯蹈火去走它一遍
如今走過這世間
萬般流連
翻過歲月不同側(cè)臉
措不及防闖入你的笑顏
我曾難自拔于世界之大
也沉溺于其中夢話
不得真假 不做掙扎 不懼笑話
我曾將青春翻涌成她
也曾指尖彈出盛夏
心之所動 且就隨緣去吧
晚風(fēng)吹起你鬢間的白發(fā)
撫平回憶留下的疤
你的眼中 明暗交雜 一笑生花
暮色遮住你蹣跚的步伐
走進(jìn)床頭藏起的畫
畫中的你 低著頭說話
我仍感嘆于世界之大
也沉醉于兒時情話
不剩真假 不做掙扎 無謂笑話
我終將青春還給了她
連同指尖彈出的盛夏
心之所動 就隨風(fēng)去了
以愛之名 你還愿意嗎
其實還可以,有些歌詞吐字本身就不是很清晰。
流式應(yīng)用(Streaming Usage)
這是官方文檔給出的應(yīng)用案例,看起來我這里的切割歌曲法并沒有什么異同,略。
import sys
import torch
import wave
import wenetruntime as wenet
test_wav = sys.argv[1]
with wave.open(test_wav, 'rb') as fin:
assert fin.getnchannels() == 1
wav = fin.readframes(fin.getnframes())
decoder = wenet.Decoder(lang='chs')
# We suppose the wav is 16k, 16bits, and decode every 0.5 seconds
interval = int(0.5 * 16000) * 2
for i in range(0, len(wav), interval):
last = False if i + interval < len(wav) else True
chunk_wav = wav[i: min(i + interval, len(wav))]
ans = decoder.decode(chunk_wav, last)
print(ans)
為了確定兩者本質(zhì)沒有區(qū)別,這里查看API源代碼. 可以看到decode_wav 就是相當(dāng)于幫你用wave庫打開wav文件并傳遞給decode方法。
文章來源:http://www.zghlxwxcb.cn/news/detail-518780.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-518780.html
到了這里,關(guān)于深度學(xué)習(xí)應(yīng)用-WeNet語音識別實戰(zhàn)01的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!