如何使用開源 AI 構建實時語音翻譯器
基於 GMI Cloud 軟件工程師鄧格麗絲的 ODSC 網絡研討會
您可以觀看 原始網絡研討會錄製在此!
簡介
想像一下用英語說「你好」,然後聽到它用中文說回來 —— 即時、自然而且有個性。這就是即時語音翻譯能夠做到的,現在,借助開放原始碼工具和可擴展的基礎架構,任何人都可以構建它。
在最近的 ODSC 網絡研討會中,GMI Cloud 軟件工程師鄧格麗絲(Grace Deng)在不到一小時內完成了一個語音轉語音翻譯器。本指南概述了所使用的關鍵步驟和開源工具,因此您可以在幾分鐘內完成並部署自己的步驟。
您將構建什麼
您將創建一個具有以下功能的即時語音翻譯器:
- 🎤 通過麥克風進行實時語音輸入
- 📝 使用 Whisper 自動英語語音轉錄
- 🌐 使用 LLama 3 將英語文本翻譯成中文
- 🔊 使用 XTTS 在中文中文生成文本到語音
- 🚀 與 Gradio 一起部署以進行基於瀏覽器的互動
使用案例:
- 旅行助理
- 無障礙支援
- 即時會議翻譯
您將使用的工具
核心人工智能模型
- 低語 (ASR): 語音轉文字轉錄
- LLAMA-3 (法學碩士): 文字翻譯從英語到中文
- 科基 XTTS v2 (TTS): 語音合成,支持多語言輸出
支援堆疊
- 變壓器: 用於 ASR 和法學碩士的 HuggingFace 管道
- 不同:支持 ASR/TTTS 加速的多 GPU
- 格拉迪奧: 快速用戶界面,實時瀏覽器互動
- GMI 雲端應用程式介面:用於大規模模推論的託管端點
分步指南
📁 項目結構
voice_translator/
├── translator.py # Main app script
├── audio.wav # Output audio file
├── requirements.txt # Dependencies
└── README.md # Project documentation1.設定您的環境
創建您的 Python 環境(Conda 或 venv),在 requirements.txt 文件中添加依賴項,然後安裝:
pip install -r requirements.txt二.匯入相依性
以下是導入的依賴項列表以及我們需要它們的原因。
- gradio:用於構建基於 Web 的用戶界面。
- os:用於與文件系統互動。
- 手電筒:用於運行 ML 模型的核心 PyTorch 庫。
- 低語:OpenAI 的 ASR 模型,用於將語音轉換為文本。
- TTS.api.tts:來自 Coqui-AI/TTS 庫的 TTS 引擎,用於將文本轉換為語音。
- 請求:用於 HTTP 請求(例如下載資源)。
- 變壓器:用於使用預先訓練的模型(例如,用於翻譯)的 HuggingFace 庫。
- numpy:通用數值計算。
- 書籍:音頻處理和功能提取。
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 設備進行兩個主要任務:
- 低聲 ASR(自動語音識別) — 將口語轉換為文本
- 文字轉語音 (TTS) — 將翻譯的文本合成回語音
我們的目標是在單獨的 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")4.低聲 ASR:語音轉文本
在本節中,我們使用 OpenAI 準備自動語音識別(ASR)組件 低音大聲 V3 模型,由擁抱臉變形器驅動。
- 🔁 管道:Whisper ASR 模型和處理器包裝在一個管道中,可以逐個處理音頻(每批最多 30 秒),以提高處理效率。
- 🎧 預處理音頻:將音頻輸入 ASR 模型之前,我們需要確保音頻是正確的格式。以下功能將音頻重新取樣為 16kHz(如果尚未使用),將其轉換為單聲道(如果是立體聲),並確保其處理為正確的數據類型。
- 📝 轉錄音頻:此功能將音頻作為輸入,預先處理它,並將其通過 Whisper ASR 管道以生成轉錄。音頻首先重新取樣並轉換,然後標準化,最後發送到模型進行轉錄。
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_text5.使用拉瑪 -3 進行翻譯
在此步驟中,我們通過介紹來彌合轉錄和語音合成之間的差距 文字翻譯。
🔁 使用 LLAMA-3 API 翻譯文本
要將英語成績單翻譯成中文,我們通過 REST API 使用託管的 LLAMA-3 模型(https://api.gmi-serving.com/v1/chat/completions)。此函數在 Python 中包裹對 API 的呼叫,並使用具有適當的標題和有效負載的 POST 請求。
- 授權標頭包含持有代幣(API 金鑰)。
- 請求有效負載指定:
- 模型名稱(元-拉瑪/拉瑪 -3.3-70B-指令)
- 系統訊息指示模型執行英文翻譯成中文,並僅返回翻譯。
- 包含輸入文字的使用者訊息。
- 測定性輸出的溫度(0)和令牌限制為 500。
回應被解析為 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"
六.科基 XTTS:文字轉語音
在本節中,我們通過從翻譯文本生成音頻並將所有組件連接到一個功能來完成語音到語音翻譯管道。
🔁 加載 TTS 模型
Coqui TTS 的多語言 TTS 模型 xtts_v2 被加載並移至指定的 TTS 設備(device_tts),確保使用 GPU(如果可用)快速推論。
🎙️ 將翻譯的文本轉換為語音
我們定義了一個函數 text_to_speech,該函數接收翻譯文本並從中生成語音音文件。
- 輸出音頻保存為 "audio.wav"。
- 該功能使用預先定義的揚聲器語音「Ana Florence」,輸出語言設置為「zh-cn」(中文)。
- 來自 Coqui TTS 的 tts_to_file () 處理合成並將音頻寫入磁盤。
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()函數集成了所有階段:
- 輸入:接收原始音頻片段(用戶的語音)。
- 檢查:如果沒有提供音頻,則返回「無」。
- 轉錄:使用 Whisper 將音頻轉換為英語文本。
- 翻譯:使用 LLama 將英文文本翻譯成中文。
- 合成:從翻譯的文本生成語音中文音頻片段。
最後,它返回生成的音頻文件的路徑。
✅ 您現在有一個功能齊全的語音轉語音翻譯器:英語音頻輸入 → 中文音頻輸出!
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 實例來處理:
- 輸入:來自用戶麥克風的實時音頻(gr.Audio(來源 =「麥克風」))。
- 輸出:以中文產生的音頻,也在麥克風格的音頻小部件中渲染以進行播放。
- 功能:先前定義的 voice_to_voice () 函數用作核心處理管道。
- 中繼資料:
- 標題:「語音到語音翻譯器」
- 描述:提供系統行為的逐步摘要。
- 即時模式:啟用(LIVE = True)以支持即時音頻流式傳輸。
🚀 啟動應用程序
最後,我們使用 share = true 調用 .launch () 為:
- 啟動應用程式的本機伺服器。
- 生成公開 URL,以便您可以在線與其他人分享演示,以進行測試或展示語音到語音翻譯器。
# --- 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)
來自格蕾絲的專業提示
- 在單獨的 GPU 上執行 ASR 和 TTS 以降低延遲
- 使用乾淨的 16kHz 音頻輸入來提高低語音準確度
- 調整溫度並提示翻譯準確度
- 使用 Coqui 語音克隆進行自定義揚聲器或輔助功能調整
資源
構建無限制的 AI
GMI Cloud 隨時協助您快速啟動您的 AI 專案。有了 GPU 支援的 API 和託管端點,您不需要僅僅為了實驗而爭取基礎架構。
加入 GMI 混亂社群 與其他建構者聯繫並分享您的創作。
.png)

