音频课程文档

语音到语音翻译

Hugging Face's logo
加入 Hugging Face 社区

并获得增强型文档体验

开始使用

语音到语音翻译

语音到语音翻译 (STST 或 S2ST) 是一项相对较新的口语处理任务。它涉及将一种语言的语音翻译成**另一种**语言的语音。

Diagram of speech to speech translation

STST 可以被视为传统机器翻译 (MT) 任务的扩展:我们不是将一种语言的**文本**翻译成另一种语言,而是将一种语言的**语音**翻译成另一种语言。STST 在多语言通信领域具有应用价值,使不同语言的说话者能够通过语音进行交流。

假设您想与跨语言障碍的其他人进行交流。与其编写您想要传达的信息,然后将其翻译成目标语言的文本,不如直接说出来,并让 STST 系统将您的口语转换为目标语言。然后,接收者可以通过对着 STST 系统说回话来做出回应,而您可以听到他们的回应。与基于文本的机器翻译相比,这是一种更自然的交流方式。

在本章中,我们将探讨 STST 的一种级联方法,将您在本课程第 5 单元和第 6 单元中获得的知识整合在一起。我们将使用语音翻译 (ST) 系统将源语音转录成目标语言的文本,然后使用文本到语音 (TTS) 从翻译后的文本生成目标语言的语音。

Diagram of cascaded speech to speech translation

我们也可以使用三阶段方法,首先使用自动语音识别 (ASR) 系统将源语音转录成相同语言的文本,然后使用机器翻译将转录的文本翻译成目标语言,最后使用文本到语音生成目标语言的语音。但是,向管道添加更多组件会导致错误传播,其中一个系统中引入的错误会在流经其余系统时加剧,并且还会增加延迟,因为必须对更多模型进行推理。

虽然这种级联的 STST 方法非常简单,但它产生了非常有效的 STST 系统。ASR + MT + TTS 的三阶段级联系统以前被用于为许多商业 STST 产品提供支持,包括Google 翻译。它也是开发 STST 系统的一种非常数据和计算高效的方式,因为现有的语音识别和文本到语音系统可以结合在一起,从而产生新的 STST 模型,而无需任何额外的训练。

在本单元的剩余部分,我们将重点关注创建将任何语言 X 的语音翻译成英语语音的 STST 系统。所涵盖的方法可以扩展到将任何语言 X 翻译成任何语言 Y 的 STST 系统,但我们将此留作读者的扩展,并在适用的情况下提供提示。我们进一步将 STST 的任务划分为其两个组成部分:ST 和 TTS。最后,我们将它们组合在一起,构建一个 Gradio 演示来展示我们的系统。

语音翻译

我们将使用 Whisper 模型作为我们的语音翻译系统,因为它能够将 96 种以上语言翻译成英语。具体来说,我们将加载Whisper Base 检查点,其参数数量为 7400 万。它绝不是性能最好的 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")
在这里,我们使用专门针对英语 TTS 训练的 SpeechT5 检查点。如果您希望翻译成英语以外的语言,请将检查点替换为您选择的语言的 SpeechT5 TTS 模型,或使用目标语言中预训练的 MMS TTS 检查点。

与 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 期望的输出音频文件格式。为此,我们首先必须根据目标数据类型(int16)的动态范围对音频数组进行归一化,然后从默认的 NumPy 数据类型(float64)转换为目标数据类型(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 空间上运行的 Gradio 演示。

您可以复制此演示并对其进行调整,以使用不同的 Whisper 检查点、不同的 TTS 检查点,或放宽输出英语语音的限制,并按照提供的提示将其翻译成您选择的语言!

展望未来

虽然级联系统是构建 STST 系统的一种计算和数据高效的方式,但它也存在上述错误传播和累加延迟的问题。最近的研究探索了一种直接的 STST 方法,该方法不预测中间文本输出,而是直接从源语音映射到目标语音。这些系统还能够在目标语音中保留源说话人的说话特征(例如韵律、音调和语调)。如果您有兴趣了解更多关于这些系统的信息,请查看“补充阅读”部分列出的资源。