在前一篇利用 Azure TTS 來進行TTS後, 接著就研究反向的技術, 語音轉文字。微軟當然也有這項 API, 但語音識別有 Facebook 推出的 SeamlessM4T 模型可以做,而且效果也不錯,就使用這個模型來識別就可以了。
Facebook SeamlessM4T
Facebook SeamlessM4T 其實包含好了幾種技術
- S2ST: 語音轉語音的翻譯,例如直接將英文語英翻成中文
- S2TT: 語音轉文字翻譯,這比較像是把英文語音直接轉中文文字
- T2ST: 文字直接轉語音,文字和語音不同語言
- T2TT: 不同語言間的翻譯
- ASR: 語音轉文字,同一種語言
功能很齊全,這次我們只用 ASR 這個功能,也許其它的東西將來有機會用到。如果想要試用的話,也有線上 demo 可以使用看看。
基本環境安裝
一些基本的環境 (如 anaconda、共用 script) 的設定,已經寫在【共同操作】 這篇文章裡,請先看一下,確保所以指令可以正確運作。
建立 conda env
由於每個專案的相依性都不同,這裡會為每個案子都建立環境。
1 2 |
conda create -n m4t python=3.8 conda activate m4t |
下載專案與模型
1 2 3 4 5 |
git clone https://github.com/facebookresearch/seamless_communication cd seamless_communication git clone https://huggingface.co/facebook/seamless-m4t-vocoder git clone https://huggingface.co/facebook/seamless-m4t-large echo "conda activate m4t > env |
這裡我們會下載要用到的語言模型 “seamless-m4t-vocoder” 和 “seamless-m4t-large”。不先下載的話,使用過程中也會自己下載,最終會放在位置 “~/.cache/torch/hub/”。如果你只是要試用評估,可以先跳過這部份,修改上還是有點繁雜。
由於下載的是一個 python 的套件的原始碼,要指定模型路徑的話,要修改一點東西。要使用指定模型的位置要先修改下面3個檔案,位置在 src/seamless_communication/assets/cards/
- seamlessM4T_large.yaml: multitask_unity_large.pt
- vocoder_36langs.yaml: vocoder_36langs.pt
- unity_nllb-100.yaml: tokenizer.model
把裡面的 checkpoint / tokenizer 分別改成指向已下載的模型位置。例如
- seamlessM4T_large.yaml: file://home/ubuntu/m4t/seamless_communication/seamless-m4t-large/multitask_unity_large.pt
- vocoder_36langs.yaml: file://home/ubuntu/m4t/seamless_communication/seamless-m4t-vocoder/vocoder_36langs.pt
- unity_nllb-100.yaml: file://home/ubuntu/m4t/seamless_communication/seamless-m4t-large/tokenizer.model
要特別注意的是,這裡的 file:// ,只能有2個slash而不是3個,用3個的話會錯誤,據說是為了安全因素。
安裝套件
1 2 3 |
conda install -c conda-forge libsndfile==1.0.31 pip install OpenCC==1.1.0 pip install . |
接下來就安裝 seamless 這個套件,中間過程要下載很多東西,請稍待。
執行範例
1 2 3 4 5 6 7 8 9 10 11 |
import torch from seamless_communication.models.inference import Translator from opencc import OpenCC cc = OpenCC('s2t') translator = Translator("seamlessM4T_large", vocoder_name_or_card="vocoder_36langs", device=torch.device("cuda:0")) transcribed_text, _, _ = translator.predict("out.wav", "asr", "cmn") all=str(transcribed_text) print(cc.convert(all)) |
安裝完成後,就可以來執行範例程式。上面的範例就會將 “out.wav” 這個檔做語音辨示,並印出來。若之前模型路徑有錯誤的話,會出現錯誤。再執行一次 pip install . 的部份,就可以修正再試一次。
結語
學著學著,AI的技術儲備的越來越完整了。大語言、翻譯、TTS、語音識別,瞭解的技術越多,就能做出更豐富的組合。