按照本指南创建自己的语音翻译代理!
Aliquet morbi justo auctor cursus auctor aliquam. Neque elit blandit et quis tortor vel ut lectus morbi. Amet mus nunc rhoncus sit sagittis pellentesque eleifend lobortis commodo vestibulum hendrerit proin varius lorem ultrices quam velit sed consequat duis. Lectus condimentum maecenas adipiscing massa neque erat porttitor in adipiscing aliquam auctor aliquam eu phasellus egestas lectus hendrerit sit malesuada tincidunt quisque volutpat aliquet vitae lorem odio feugiat lectus sem purus.
Viverra mi ut nulla eu mattis in purus. Habitant donec mauris id consectetur. Tempus consequat ornare dui tortor feugiat cursus. Pellentesque massa molestie phasellus enim lobortis pellentesque sit ullamcorper purus. Elementum ante nunc quam pulvinar. Volutpat nibh dolor amet vitae feugiat varius augue justo elit. Vitae amet curabitur in sagittis arcu montes tortor. In enim pulvinar pharetra sagittis fermentum. Ultricies non eu faucibus praesent tristique dolor tellus bibendum. Cursus bibendum nunc enim.
Mattis quisque amet pharetra nisl congue nulla orci. Nibh commodo maecenas adipiscing adipiscing. Blandit ut odio urna arcu quam eleifend donec neque. Augue nisl arcu malesuada interdum risus lectus sed. Pulvinar aliquam morbi arcu commodo. Accumsan elementum elit vitae pellentesque sit. Nibh elementum morbi feugiat amet aliquet. Ultrices duis lobortis mauris nibh pellentesque mattis est maecenas. Tellus pellentesque vivamus massa purus arcu sagittis. Viverra consectetur praesent luctus faucibus phasellus integer fermentum mattis donec.
Commodo velit viverra neque aliquet tincidunt feugiat. Amet proin cras pharetra mauris leo. In vitae mattis sit fermentum. Maecenas nullam egestas lorem tincidunt eleifend est felis tincidunt. Etiam dictum consectetur blandit tortor vitae. Eget integer tortor in mattis velit ante purus ante.
“Lacus donec arcu amet diam vestibulum nunc nulla malesuada velit curabitur mauris tempus nunc curabitur dignig pharetra metus consequat.”
Commodo velit viverra neque aliquet tincidunt feugiat. Amet proin cras pharetra mauris leo. In vitae mattis sit fermentum. Maecenas nullam egestas lorem tincidunt eleifend est felis tincidunt. Etiam dictum consectetur blandit tortor vitae. Eget integer tortor in mattis velit ante purus ante.
基于 GMI Cloud 软件工程师 Grace Deng 的 ODSC 网络研讨会
你可以看 原始网络研讨会录像在这里!
想象一下,用英语说 “你好”,然后听到它用普通话说话——即刻、自然、有个性。这就是实时语音翻译可以做的事情,现在,有了开源工具和可扩展的基础架构,任何人都可以构建它。
在最近的一次ODSC网络研讨会中,GMI Cloud的软件工程师Grace Deng在不到一个小时的时间内完成了语音转换器的构建过程。本指南提炼了所使用的关键步骤和开源工具,因此您可以在几分钟内完成操作并部署自己的工具。
您将创建一个具有以下功能的实时语音翻译器:
用例:
voice_translator/
├── translator.py # Main app script
├── audio.wav # Output audio file
├── requirements.txt # Dependencies
└── README.md # Project documentation
创建你的 Python 环境(Conda 或 venv),在 requirements.txt 文件中添加依赖关系,然后安装:
pip install -r requirements.txt
以下是导入的依赖项列表以及我们为什么需要它们。
import gradio as gr
import os
import torch
import whisper as whisper_ai
from TTS.api import TTS
import requests
import transformers
import numpy
import librosa
本节为运行我们的硬件做好准备 语音转语音翻译器 通过为两项主要任务分配 GPU 设备:
我们的目标是在单独的 GPU(如果可用)上运行每项任务,以获得最佳性能。
✅ 提示:在使用 Whisper 和 TTS 等深度学习模型时,将工作负载分布在多个 GPU 上可以显著提高运行时性能并减少延迟。您可以随意以适合您的设备的方式分散工作量。在这种情况下,我们使用最后两个 GPU。
num_gpus = torch.cuda.device_count()
if num_gpus >= 2:
device_whisper = f"cuda:{num_gpus - 2}"
device_tts = f"cuda:{num_gpus - 1}"
elif num_gpus == 1:
device_whisper = device_tts = "cuda:0"
else:
device_whisper = device_tts = "cpu"
print(f"Using {device_whisper} for Whisper ASR")
print(f"Using {device_tts} for Mozilla TTS")
在本节中,我们使用 OpenAI 准备自动语音识别 (ASR) 组件 Whisper 大型版 V3 模型,由 Hugging Face 变形金刚提供动力。
torch_dtype = torch.float32
model_id = "openai/whisper-large-v3"
transcribe_model = transformers.AutoModelForSpeechSeq2Seq.from_pretrained(
model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True, use_safetensors=True
)
transcribe_model.to(device_whisper)
processor = transformers.AutoProcessor.from_pretrained(model_id)
pipe0 = transformers.pipeline(
"automatic-speech-recognition",
model=transcribe_model,
tokenizer=processor.tokenizer,
feature_extractor=processor.feature_extractor,
max_new_tokens=128,
chunk_length_s=30,
batch_size=16,
return_timestamps=True,
torch_dtype=torch_dtype,
device=device_whisper,
)
def preprocess_audio(audio):
if audio.dtype != numpy.float32:
audio = audio.astype(numpy.float32)
sr = 16000
y = librosa.resample(audio, orig_sr=sr, target_sr=sr)
if len(y.shape) > 1:
y = librosa.to_mono(y)
return y
def transcribe_audio(audio) -> str:
sr, y = audio
y = preprocess_audio(y)
y = y.astype(numpy.float32)
y /= numpy.max(numpy.abs(y))
output_text = pipe0(y, generate_kwargs={"language": "english","temperature": 0.5, "top_p": 0.9,})["text"]
print(output_text)
return output_text
在这一步中,我们通过引入来弥合转录和语音合成之间的差距 文字翻译。
为了将英文成绩单翻译成中文,我们通过REST API(https://api.gmi-serving.com/v1/chat/completions)使用托管的LLama-3模型。此函数用 Python 封装对 API 的调用,并使用带有相应标头和有效负载的 POST 请求。
响应被解析为 JSON。如果响应有效且成功(status_code == 200),则该函数提取翻译后的消息并将其返回。否则,它会优雅地处理错误并记录有用的调试信息。
✅ 此时,你可以转录英语音频,将其翻译成中文,现在可以生成中文音频输出了。
def translate_text(text):
url = "https://api.gmi-serving.com/v1/chat/completions"
headers = {
"Content-Type": "application/json",
"Authorization": "<GMI_API_KEY>"
}
payload = {
"model": "meta-llama/Llama-3.3-70B-Instruct",
"messages": [
{"role": "system", "content": "Translate the following English text into Chinese. Include the translation and nothing else."},
{"role": "user", "content": text}
],
"temperature": 0,
"max_tokens": 500
}
response = requests.post(url, headers=headers, json=payload, verify=False)
if response.status_code == 200:
try:
data = response.json()
translated_text = data['choices'][0]['message']['content']
except ValueError as e:
print("Failed to parse JSON:", e)
return translated_text
else:
print("Error with the request:", response.status_code, response.text)
return "No translation provided"
在本节中,我们通过从翻译后的文本中生成音频并将所有组件连接成一个功能,来完成语音到语音的翻译流程。
来自 Coqui TTS 的多语言 TTS 模型 xtts_v2 已加载并移动到指定的 TTS 设备 (device_tts),从而确保在可用时使用 GPU 进行快速推理。
我们定义了一个函数 text_to_seech,该函数接收翻译后的文本并从中生成语音文件。
tts_model = TTS("tts_models/multilingual/multi-dataset/xtts_v2")
tts_model.to(device_tts)
def text_to_speech(text):
output_path = "audio.wav"
tts_model.tts_to_file(text=text, file_path=output_path, speaker="Ana Florence", language="zh-cn")
return output_path
🔄 端到端语音翻译管道
voice_to_voice () 函数集成了所有阶段:
最后,它返回生成的音频文件的路径。
✅ 你现在有了功能齐全的语音转换器:英语音频输入 → 中文音频输出!
def voice_to_voice(audio):
if audio is None:
return gr.Audio(value=None)
output_audio = text_to_speech(translate_text(transcribe_audio(audio)))
return output_audio
在最后一步中,我们将语音到语音的翻译管道打包成一个用户友好的界面 格拉迪奥。
我们创建一个 Gr.Interface 实例来处理:
最后,我们将带有 share=True 的 .launch () 调用为:
# --- Gradio UI ---
demo = gr.Interface(
fn=voice_to_voice,
inputs=gr.Audio(sources="microphone"),
outputs=gr.Audio(sources=["microphone"]),
title="Voice-to-Voice Translator",
description="🎤 Speak in English → 📝 Get Chinese text → 🔊 Listen to Chinese speech.",
live=True
)
demo.launch(share=True)
GMI Cloud 可以帮助您快速启动人工智能项目。有了支持 GPU 的 API 和托管终端节点,您无需仅仅为了实验而纠结基础架构。
加入 GMI Discord 社区 与其他建筑商联系并分享您的创作。