按照本指南建立自己的語音翻譯代理程式!
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 軟件工程師鄧格麗絲的 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)組件 低音大聲 V3 模型,由擁抱臉變形器驅動。
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 使用託管的 LLAMA-3 模型(https://api.gmi-serving.com/v1/chat/completions)。此函數在 Python 中包裹對 API 的呼叫,並使用具有適當的標題和有效負載的 POST 請求。
回應被解析為 JSON。如果回應有效且成功(狀態 _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_speech,該函數接收翻譯文本並從中生成語音音文件。
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
🔄 端到端語音翻譯管道
語音 _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 隨時協助您快速啟動您的 AI 專案。有了 GPU 支援的 API 和託管端點,您不需要僅僅為了實驗而爭取基礎架構。
加入 GMI 混亂社群 與其他建構者聯繫並分享您的創作。