オープンソースAIでリアルタイム音声翻訳者を構築する方法
GMI Cloudのソフトウェアエンジニア、グレース・デン氏によるODSCウェビナーに基づく
視聴できます オリジナルのウェビナー録画はこちら!
はじめに
英語で「こんにちは」と言って、それが北京語で返されるのを想像してみてください。瞬時に、自然に、そして個性をもって話しかけられます。それがリアルタイム音声翻訳ができることです。そして今では、オープンソースのツールとスケーラブルなインフラストラクチャにより、誰でもそれを構築できます。
最近のODSCウェビナーで、GMI CloudのソフトウェアエンジニアであるGrace Dengが、音声から音声への翻訳者を1時間足らずで構築する方法を説明しました。このガイドでは、主要な手順と使用されているオープンソースのツールがまとめられているので、手順を追って独自のツールを数分でデプロイできます。
構築するもの
次の機能を備えたリアルタイム音声翻訳者を作成します。
- 🎤 マイクによるリアルタイム音声入力
- 📝 ウィスパーを使った自動英語音声文字起こし
- 🌐 lLama 3を使った英語テキストの中国語への翻訳
- 🔊 XTTSを使用した中国語での音声合成生成
- 🚀 ブラウザベースのインタラクション用にGradioを導入
ユースケース:
- トラベルアシスタント
- アクセシビリティサポート
- ライブ会議翻訳
使用するツール
コア AI モデル
- ウィスパー (ASR): 音声からテキストへの文字起こし
- ラマ3 (LLM): 英語から中国語へのテキスト翻訳
- Coqui XTTS v2 (TTS): 多言語出力をサポートする音声合成
サポートスタック
- トランスフォーマー: ASR および LLM 向けの HuggingFace パイプライン
- クーダ: ASR/TTS アクセラレーションのためのマルチ GPU サポート
- グラディオ: リアルタイムのブラウザインタラクション用の高速 UI
- GMI クラウド API: 大規模なモデル推論のためのホスト型エンドポイント
ステップ・バイ・ステップ・ガイド
📁 プロジェクト構造
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.txt2。依存関係をインポートする
インポートされた依存関係のリストと、それらが必要な理由は次のとおりです。
- gradio: ウェブベースのユーザーインターフェースを構築するためのものです。
- os: ファイルシステムの操作用。
- トーチ:ML モデルを実行するためのコア PyTorch ライブラリです。
- ウィスパー:音声をテキストに変換するためのOpenAIのASRモデル。
- TTS.api.tts: テキストを音声に変換するための Coqui-ai/TTS ライブラリの TTS エンジン。
- リクエスト:HTTP リクエスト (リソースのダウンロードなど)
- トランスフォーマー:事前トレーニング済みのモデル (翻訳用など) を使用するためのHuggingFaceライブラリ。
- numpy: 汎用数値コンピューティング
- librosa: オーディオ処理と特徴抽出
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 3。GPU デバイスの準備
このセクションでは、を実行するためのハードウェアセットアップを準備します 音声から音声へのトランスレータ GPU デバイスを次の 2 つの主要なタスクに割り当てます。
- ウィスパー ASR (自動音声認識) — 話し言葉をテキストに変換します
- テキスト・トゥ・スピーチ (TTS) — 翻訳されたテキストを音声に合成し直す
最適なパフォーマンスを実現するために、各タスクを個別の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")4。ウィスパー ASR: 音声からテキストへ
このセクションでは、OpenAIを使って自動音声認識 (ASR) コンポーネントを準備します ウィスパーラージ V3 ハギングフェイストランスフォーマーを搭載したモデル。
- 🔁 パイプライン: Whisper ASR モデルとプロセッサはパイプラインに包まれているため、オーディオをチャンク単位で(バッチあたり最大 30 秒)処理して、より効率的に処理できます。
- 🎧 オーディオの前処理: オーディオを ASR モデルに入力する前に、オーディオが正しい形式であることを確認する必要があります。次の関数は、オーディオを 16 kHz にリサンプリングし (まだリサンプリングしていない場合)、ステレオの場合はモノラルに変換して、処理に適したデータタイプであることを確認します。
- 📝 音声の文字起こし: この関数は音声を入力として受け取り、前処理して 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 で翻訳しましょう
このステップでは、以下を紹介することで、文字起こしと音声合成の間のギャップを埋めます。 テキスト翻訳。
🔁 ラマ3 API を使用してテキストを翻訳する
英語のトランスクリプトを中国語に翻訳するには、REST API (https://api.gmi-serving.com/v1/chat/completions) を介してホストされた Llama-3 モデルを使用します。この関数は API の呼び出しを Python でラップし、適切なヘッダーとペイロードを指定した POST リクエストを使用します。
- 認証ヘッダーにはベアラートークン (API キー) が含まれています。
- リクエストペイロードは以下を指定します。
- モデル名 (メタラマ/ラマ3.3-70B-インストラクト)
- 英語から中国語への翻訳を実行し、翻訳のみを返すようにモデルに指示するシステムメッセージ。
- 入力テキストを含むユーザーメッセージ。
- デターミニスティック出力の場合は温度 (0)、トークンの上限は500です。
レスポンスは 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"
6。コキ XTTS: テキストを音声に変換
このセクションでは、翻訳されたテキストから音声を生成し、すべてのコンポーネントを1つの関数に接続することで、音声から音声への翻訳パイプラインを完成させます。
🔁 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
7。すべてをまとめて
🔄 エンドツーエンドの音声翻訳パイプライン
voice_to_voice () 関数は以下のすべてのステージを統合します。
- 入力:未加工のオーディオクリップ (ユーザーの音声) を受信します。
- チェック:音声が提供されなかった場合は None を返します。
- 文字起こし: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
8。グラディオで起動
この最後のステップでは、以下を使用して、音声から音声への翻訳パイプラインをユーザーフレンドリーなインターフェースにまとめます グラディオ。
🛠️ Gradio インターフェースの定義
以下を処理する 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)
グレースからのプロのヒント
- ASR と TTS を別々の GPU で実行してレイテンシを低減
- Whisperの精度を向上させるには、クリーンな16kHzオーディオ入力を使用してください
- 翻訳の精度を高めるために温度とプロンプトを調整する
- Coquiの音声クローニングをカスタムスピーカーやアクセシビリティチューニングに使用
リソース
制限のない AI を構築
GMI Cloud は、AI プロジェクトを迅速に軌道に乗せるお手伝いをします。GPU 対応 API とホスト型エンドポイントがあれば、実験のためだけにインフラストラクチャを悩ませる必要はありません。
に参加してください GMI ディスコードコミュニティ 他のビルダーとつながり、作品を共有できます。
.png)

