音訊課程文件
語音到語音翻譯
並獲得增強的文件體驗
開始使用
語音到語音翻譯
語音到語音翻譯(STST 或 S2ST)是一項相對較新的口語處理任務。它涉及將一種語言的語音翻譯成**不同**語言的語音。

STST 可以被視為傳統機器翻譯(MT)任務的擴充套件:我們不是將一種語言的**文字**翻譯成另一種語言,而是將一種語言的**語音**翻譯成另一種語言。STST 在多語言交流領域具有應用前景,它能使不同語言的說話者透過語音媒介相互交流。
假設您想與跨越語言障礙的另一個人交流。您無需先寫下您想要表達的資訊,然後再將其翻譯成目標語言的文字,而是可以直接說出來,讓 STST 系統將您的口語轉換為目標語言。接收者可以透過對 STST 系統講話來回應,然後您可以聽他們的回應。與基於文字的機器翻譯相比,這是一種更自然的交流方式。
在本章中,我們將探討一種**級聯**的 STST 方法,將您在課程單元 5 和 6 中學到的知識整合起來。我們將使用**語音翻譯(ST)**系統將源語音轉錄成目標語言的文字,然後使用**文字到語音(TTS)**將翻譯後的文字生成目標語言的語音。

我們也可以使用三階段方法,即首先使用自動語音識別(ASR)系統將源語音轉錄成相同語言的文字,然後使用機器翻譯將轉錄後的文字翻譯成目標語言,最後使用文字到語音系統生成目標語言的語音。然而,向管道中新增更多元件會導致**錯誤傳播**,即在一個系統中引入的錯誤在流經其餘系統時會累積,同時也會增加延遲,因為需要對更多模型進行推理。
儘管這種級聯的 STST 方法非常簡單,但它能產生非常有效的 STST 系統。ASR + MT + TTS 的三階段級聯絡統曾被用於為許多商業 STST 產品提供支援,包括 Google 翻譯。它也是一種開發 STST 系統的非常資料和計算效率高的方式,因為現有的語音識別和文字到語音系統可以耦合在一起,無需額外訓練即可產生新的 STST 模型。
在本單元的其餘部分,我們將重點關注建立一個將任何語言 X 的語音翻譯成英語語音的 STST 系統。所涵蓋的方法可以擴充套件到將任何語言 X 翻譯成任何語言 Y 的 STST 系統,但我們將其留作讀者的擴充套件,並在適用時提供提示。我們進一步將 STST 任務分為其兩個組成部分:ST 和 TTS。最後,我們將它們組合在一起,構建一個 Gradio 演示來展示我們的系統。
語音翻譯
我們將使用 Whisper 模型作為我們的語音翻譯系統,因為它能夠將超過 96 種語言翻譯成英語。具體來說,我們將載入 Whisper Base 檢查點,它有 74M 引數。它絕不是效能最好的 Whisper 模型,最大的 Whisper 檢查點 比它大 20 倍以上,但由於我們將兩個自迴歸系統(ST + TTS)連線在一起,我們希望確保每個模型都能相對快速地生成,以便獲得合理的推理速度。
import torch
from transformers import pipeline
device = "cuda:0" if torch.cuda.is_available() else "cpu"
pipe = pipeline(
"automatic-speech-recognition", model="openai/whisper-base", device=device
)
太棒了!為了測試我們的 STST 系統,我們將載入一個非英語的音訊樣本。讓我們載入 VoxPopuli 資料集的義大利語(it
)拆分中的第一個示例。
from datasets import load_dataset
dataset = load_dataset("facebook/voxpopuli", "it", split="validation", streaming=True)
sample = next(iter(dataset))
要收聽此樣本,我們可以在 Hub 上使用資料集檢視器播放:facebook/voxpopuli/viewer
或使用 ipynb 音訊功能回放
from IPython.display import Audio
Audio(sample["audio"]["array"], rate=sample["audio"]["sampling_rate"])
現在,讓我們定義一個函式,該函式接受此音訊輸入並返回翻譯後的文字。您會記得,我們必須傳遞用於“task”的生成關鍵字引數,將其設定為“translate”以確保 Whisper 執行語音翻譯而不是語音識別。
def translate(audio):
outputs = pipe(audio, max_new_tokens=256, generate_kwargs={"task": "translate"})
return outputs["text"]
Whisper 也可以“被騙”將任何語言 X 的語音翻譯成任何語言 Y。只需將任務設定為 `“transcribe”`,並將 `“language”` 設定為生成關鍵字引數中的目標語言,例如對於西班牙語,可以設定
generate_kwargs={"task": "transcribe", "language": "es"}
太好了!讓我們快速檢查一下模型是否給出了合理的結果
translate(sample["audio"].copy())
' psychological and social. I think that it is a very important step in the construction of a juridical space of freedom, circulation and protection of rights.'
好的!如果我們將其與原文進行比較
sample["raw_text"]
'Penso che questo sia un passo in avanti importante nella costruzione di uno spazio giuridico di libertà di circolazione e di protezione dei diritti per le persone in Europa.'
我們看到翻譯大致吻合(您可以使用 Google 翻譯進行雙重檢查),除了轉錄開頭多出了幾個詞,那是說話者正在結束前一句。
至此,我們已經完成了級聯 STST 管道的前半部分,將我們在單元 5 學習如何使用 Whisper 模型進行語音識別和翻譯時獲得的技能付諸實踐。如果您想複習我們涵蓋的任何步驟,請閱讀單元 5 中關於用於 ASR 的預訓練模型的部分。
文字轉語音
我們級聯 STST 系統的第二部分涉及將英文文字對映到英文語音。為此,我們將使用預訓練的 SpeechT5 TTS 模型進行英文 TTS。🤗 Transformers 目前沒有 TTS `pipeline`,所以我們必須自己直接使用模型。這沒什麼大不了的,在單元 6 之後,你們都是使用模型進行推理的專家了!
首先,我們從預訓練檢查點載入 SpeechT5 處理器、模型和聲碼器。
from transformers import SpeechT5Processor, SpeechT5ForTextToSpeech, SpeechT5HifiGan
processor = SpeechT5Processor.from_pretrained("microsoft/speecht5_tts")
model = SpeechT5ForTextToSpeech.from_pretrained("microsoft/speecht5_tts")
vocoder = SpeechT5HifiGan.from_pretrained("microsoft/speecht5_hifigan")
與 Whisper 模型一樣,如果存在 GPU 加速裝置,我們也將 SpeechT5 模型和聲碼器放置在上面。
model.to(device) vocoder.to(device)
太好了!讓我們載入說話人嵌入。
embeddings_dataset = load_dataset("Matthijs/cmu-arctic-xvectors", split="validation")
speaker_embeddings = torch.tensor(embeddings_dataset[7306]["xvector"]).unsqueeze(0)
我們現在可以編寫一個函式,它接受文字提示作為輸入,並生成相應的語音。我們首先使用 SpeechT5 處理器預處理文字輸入,對文字進行標記以獲取我們的輸入 ID。然後我們將輸入 ID 和說話人嵌入傳遞給 SpeechT5 模型,如果可用,則將它們放置在加速裝置上。最後,我們將返回生成的語音,將其帶回 CPU,以便我們可以在 ipynb 筆記本中播放它。
def synthesise(text):
inputs = processor(text=text, return_tensors="pt")
speech = model.generate_speech(
inputs["input_ids"].to(device), speaker_embeddings.to(device), vocoder=vocoder
)
return speech.cpu()
讓我們用一個虛擬文字輸入檢查它是否有效
speech = synthesise("Hey there! This is a test!")
Audio(speech, rate=16000)
聽起來不錯!現在是激動人心的部分——將它們整合在一起。
建立 STST 演示
在我們建立 Gradio 演示來展示我們的 STST 系統之前,我們先快速進行一次健全性檢查,以確保我們可以連線這兩個模型,即輸入一個音訊樣本並輸出一個音訊樣本。我們將透過連線前面兩個小節中定義的兩個函式來實現這一點,這樣我們就可以輸入源音訊並檢索翻譯後的文字,然後將翻譯後的文字合成以獲得翻譯後的語音。最後,我們將合成的語音轉換為 `int16` 陣列,這是 Gradio 所需的輸出音訊檔案格式。為此,我們首先必須透過目標 dtype (`int16`) 的動態範圍對音訊陣列進行歸一化,然後從預設的 NumPy dtype (`float64`) 轉換為目標 dtype (`int16`)
import numpy as np
target_dtype = np.int16
max_range = np.iinfo(target_dtype).max
def speech_to_speech_translation(audio):
translated_text = translate(audio)
synthesised_speech = synthesise(translated_text)
synthesised_speech = (synthesised_speech.numpy() * max_range).astype(np.int16)
return 16000, synthesised_speech
讓我們檢查一下這個級聯函式是否給出預期結果
sampling_rate, synthesised_speech = speech_to_speech_translation(sample["audio"])
Audio(synthesised_speech, rate=sampling_rate)
完美!現在我們將其封裝到一個漂亮的 Gradio 演示中,以便我們可以使用麥克風輸入或檔案輸入錄製我們的源語音,並播放系統的預測。
import gradio as gr
demo = gr.Blocks()
mic_translate = gr.Interface(
fn=speech_to_speech_translation,
inputs=gr.Audio(source="microphone", type="filepath"),
outputs=gr.Audio(label="Generated Speech", type="numpy"),
)
file_translate = gr.Interface(
fn=speech_to_speech_translation,
inputs=gr.Audio(source="upload", type="filepath"),
outputs=gr.Audio(label="Generated Speech", type="numpy"),
)
with demo:
gr.TabbedInterface([mic_translate, file_translate], ["Microphone", "Audio File"])
demo.launch(debug=True)
這將啟動一個 Gradio 演示,類似於 Hugging Face Space 上執行的那個。
您可以複製這個演示並對其進行修改,以使用不同的 Whisper 檢查點、不同的 TTS 檢查點,或者放寬輸出英語語音的限制,並按照提供的提示翻譯成您選擇的語言!
展望未來
雖然級聯絡統是一種計算和資料高效的 STST 系統構建方式,但它存在上述錯誤傳播和累加延遲問題。最近的研究探索了一種**直接**的 STST 方法,這種方法不預測中間文字輸出,而是直接從源語音對映到目標語音。這些系統還能夠保留源說話者在目標語音中的說話特徵(如韻律、音高和語調)。如果您有興趣瞭解更多關於這些系統的資訊,請檢視補充閱讀部分列出的資源。
< > 在 GitHub 上更新