Follow this guide to build your own voice translator agent!
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が、音声から音声への翻訳者を1時間足らずで構築する方法を説明しました。このガイドでは、主要な手順と使用されているオープンソースのツールがまとめられているので、手順を追って独自のツールを数分でデプロイできます。
次の機能を備えたリアルタイム音声翻訳者を作成します。
ユースケース:
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 デバイスを次の 2 つの主要なタスクに割り当てます。
最適なパフォーマンスを実現するために、各タスクを個別のGPU(利用可能な場合)で実行することを目指しています。
✅ ヒント:Whisper や TTS などのディープラーニングモデルを使用する場合、ワークロードを複数の GPU に分散させると、ランタイムパフォーマンスが大幅に向上し、レイテンシーが減少します。お使いのデバイスに適した方法でワークロードを自由に分散させてください。この場合、最後の 2 つの 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 (https://api.gmi-serving.com/v1/chat/completions) を介してホストされた Llama-3 モデルを使用します。この関数は API の呼び出しを Python でラップし、適切なヘッダーとペイロードを指定した 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"
このセクションでは、翻訳されたテキストから音声を生成し、すべてのコンポーネントを1つの関数に接続することで、音声から音声への翻訳パイプラインを完成させます。
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
🔄 エンドツーエンドの音声翻訳パイプライン
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 は、AI プロジェクトを迅速に軌道に乗せるお手伝いをします。GPU 対応 API とホスト型エンドポイントがあれば、実験のためだけにインフラストラクチャを悩ませる必要はありません。
に参加してください GMI ディスコードコミュニティ 他のビルダーとつながり、作品を共有できます。