音频课程文档
语音到语音翻译
并获得增强的文档体验
开始
语音到语音翻译
语音到语音翻译 (STST 或 S2ST) 是一项相对较新的口语处理任务。它涉及将一种语言的语音翻译成不同语言的语音

STST 可以被视为传统机器翻译 (MT) 任务的扩展:我们不是将一种语言的 文本 翻译成另一种语言,而是将一种语言的 语音 翻译成另一种语言。STST 在多语言交流领域具有应用,使不同语言的说话者能够通过语音媒介相互交流。
假设您想跨越语言障碍与另一个人交流。您可以直接说出您想表达的信息,并让 STST 系统将您说的语音转换为目标语言,而不是写下您想表达的信息,然后将其翻译成目标语言的文本。接收者然后可以通过对着 STST 系统说话来回应,您可以听到他们的回应。与基于文本的机器翻译相比,这是一种更自然的交流方式。
在本章节中,我们将探索 STST 的级联方法,将您在课程单元 5 和单元 6 中获得的知识整合在一起。我们将使用语音翻译 (ST) 系统将源语音转录为目标语言的文本,然后使用文本到语音 (TTS) 从翻译后的文本生成目标语言的语音

我们也可以使用三阶段方法,首先我们使用自动语音识别 (ASR) 系统将源语音转录为相同语言的文本,然后使用机器翻译将转录的文本翻译成目标语言,最后使用文本到语音生成目标语言的语音。但是,向管道添加更多组件会导致错误传播,其中在一个系统中引入的错误会在流经其余系统时复合,并且还会增加延迟,因为必须为更多模型进行推理。
虽然这种 STST 的级联方法非常直接,但它产生了非常有效的 STST 系统。ASR + MT + TTS 的三阶段级联系统以前用于驱动许多商业 STST 产品,包括 Google 翻译。这也是一种非常数据和计算高效的开发 STST 系统的方法,因为现有的语音识别和文本到语音系统可以耦合在一起以产生新的 STST 模型,而无需任何额外的训练。
在本单元的剩余部分,我们将重点创建一种 STST 系统,该系统将任何语言 X 的语音翻译成英语语音。所涵盖的方法可以扩展到将任何语言 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 模型和声码器放在我们的 GPU 加速器设备上
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)
这将启动一个类似于在 Hugging Face Space 上运行的 Gradio 演示
您可以 复制 此演示并对其进行调整,以使用不同的 Whisper 检查点、不同的 TTS 检查点,或放宽输出英语语音的限制,并按照提供的提示将其翻译成您选择的语言!
展望未来
虽然级联系统是构建 STST 系统的一种计算和数据高效的方式,但它存在上述错误传播和累加延迟的问题。最近的工作探索了 STST 的直接方法,该方法不预测中间文本输出,而是直接从源语音映射到目标语音。这些系统还能够保留目标语音中源说话者的说话特征(例如韵律、音调和语调)。如果您有兴趣了解有关这些系统的更多信息,请查看 补充阅读 部分中列出的资源。
< > 在 GitHub 上更新