简介
最近 Meta 释出了多语多模 AI 翻译模型 SeamlessM4T,宣称支援近 100 种语言,而且有开源模型权重,于是笔者就来体验了一下这个模型,看看翻译蒟蒻是否真要问世?
这个模型的参数量并没有很大,可以在 Google Colab 轻鬆跑起来,笔者将使用方法整理至这份 Demo 里面以供参考,目前这个模型的 License 为 CC By-NC 4.0 不可商用。
SeamlessM4T - Blog | GitHub | Official Demo | HF Space Demo | Paper
安装
运作 SeamlessM4T 需要安装 seamless_communication
套件,按照以下步骤执行:
git clone https://github.com/facebookresearch/seamless_communication.gitcd seamless_communicationgit checkout c82b98 # (Optional) 这是笔者最后测试的版本pip install .
这东西要装蛮久的,可以考虑借用 Colab 的超强网路快速搭建环境出来用。如果是在自己的 Conda 环境里面,还需要额外装一个 libsndfile
套件:
conda install -y -c conda-forge libsndfile
使用
目前有 seamlessM4T_large
与 seamlessM4T_medium
可以选用,参数量分别为 2.3B 与 1.2B 两种规模,首先初始化一个 Translator
出来:
import torchfrom seamless_communication.models.inference import Translatormodel = "seamlessM4T_large" # or "seamlessM4T_medium"translator = Translator( model, vocoder_name_or_card="vocoder_36langs", device=torch.device("cuda:0"), dtype=torch.float16,)
佔用的 GPU Memory 约在 5 ~ 6 GB 左右,应该是普通显卡都能跑得动。接下来,我们先用文字转语音生成一段音档试试看:
results = translator.predict( input="今天天气真好!", task_str="T2ST", src_lang="cmn", tgt_lang="eng", spkr=0,)translated_text, wav, sr = resultsprint(translated_text) # It's a beautiful day!
其中 task_str
是任务名称,目前共支援五种任务:
S2ST
- Speech-To-Speech TranslationS2TT
- Speech-To-Text TranslationT2ST
- Text-To-Speech TranslationT2TT
- Text-To-Text TranslationASR
- Automatic Speech Recognitioneng
与 cmn
是语言代码,分别是「英文」与「普通话」的意思。详细的代码列表可以参考这个档案或者原论文第 14 页。根据论文所述,有些语言只支援文字,有些语言只支援语音,而目前支援语音的部份约有三十几种语言。在 T2ST
与 T2TT
里面,必须要给 src_lang
代表来源语言是什么。
回传的 translated_text
, wav
, sr
分别是翻译后的文字、音档内容与音档的 Sample Rate 等资讯,这里可以透过 torchaudio
将结果存为音档:
import torchaudiotorchaudio.save("output.wav", wav.squeeze(0).cpu(), sr)
如果是使用 Jupyter Notebook 或 Colab 也可以直接将音档播放出来:
from IPython.display import AudioAudio(wav.squeeze(0).cpu(), rate=sr)
上面合成出来的英文语音,听起来还算不错。接下来我们将同样这段语音转回中文看看:
results = translator.predict( input="result_t2st.wav", task_str="S2ST", tgt_lang="cmn",)translated_text, wav, sr = resultsprint(translated_text) # 这是一个美好的日子
这样就完成反向转换了,同样可以用上述方法播放出来听看看。
结论
笔者尝试了一些不同的句子,发现效果落差挺大的。撇除中文的口音与机械音很重以外,当文本长度拉长时,转换出来的语音就会开始变的很奇怪。有些句子就算很短,也会有疯狂跳针的情况。目前测试下来,虽然是个有趣的模型,但显然还不够强大,看来我们距离万能的翻译蒟蒻问世还有一段距离需要努力。