音声翻訳の使用

音声から音声への翻訳機能は、AI を使用して言語を解釈し、異なる言語を話す個人とシステム間の会話を可能にします。アプリケーションは、この機能を使用して、ある言語の音声を含む音声ストリームを処理し、別の言語にリアルタイムで翻訳できます。

ターンベースの会話をサポートする他の Live API 機能とは異なり、音声から音声への翻訳では、音声入力が継続的に処理され、次の出力が利用可能になるとストリーミングされます。

  • 音声文字変換: 入力音声ストリームから認識された原文言語のテキスト。
  • 翻訳: ターゲット言語に翻訳されたテキスト。
  • 合成音声: 元の話し手の声と一致するターゲット言語で読み上げられた翻訳テキストの音声ストリーム。

サポートされているモデル

音声から音声への翻訳には、次のモデルを使用できます。

モデル バージョン 可用性レベル
gemini-2.5-flash-s2st-exp-11-2025 非公開試験運用版

入力音声の要件

音声から音声への翻訳は音声入力のみをサポートしています。サポートされている音声形式、コーデック、サンプルレートなどの仕様については、サポートされている音声形式をご覧ください。

音声翻訳を使用する

音声から音声への翻訳を使用するには、次のコード例をご覧ください。

Python

# Set language_code to your desired language, in this case, Mandarin Chinese.
speech_config = SpeechConfig(language_code="cmn")

config = LiveConnectConfig(
    response_modalities=["AUDIO"],
    speech_config=speech_config,
    input_audio_transcription=input_transcription,
    output_audio_transcription=output_transcription,
)

audio_file = Part.from_uri(file_uri=audio_url, mime_type="audio/mpeg")
contents = [audio_file]

response = client.models.generate_content(model=MODEL_ID, contents=contents)
display(Markdown(response.text))

Python

import asyncio

# Set model generation_config
CONFIG = {
    "response_modalities": ["AUDIO"],
    "speech_config": {
        "language_code": "cmn",
    },
}

headers = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {bearer_token[0]}",
}

# Connect to the server
async with connect(SERVICE_URL, additional_headers=headers) as ws:
    # Setup the session
    await ws.send(
        json.dumps(
            {
                "setup": {
                    "model": MODEL,
                    "generation_config": CONFIG,
                    "input_audio_transcription": {},
                    "output_audio_transcription": {},
                    "enable_speech_to_speech_translation": True,
                }
            }
        )
    )

    # Receive setup response
    raw_response = await ws.recv(decode=False)
    setup_response = json.loads(raw_response.decode("ascii"))
    print(setup_response)

    msg = {
        "realtime_input": {
            "audio": {
                "mime_type": "audio/pcm",
                "data": base64.b64encode(wav_data).decode('utf-8'),
            }
        }
    }

    await ws.send(json.dumps(msg))

    overall_responses = []
    timeout_seconds = 10 # Set timeout to 3 seconds

    # Receive chucks of server response with a timeout
    try:
        while True:
            try:
                raw_response = await asyncio.wait_for(ws.recv(decode=False), timeout_seconds)
                response = json.loads(raw_response.decode())
                server_content = response.pop("serverContent", None)
                if server_content is None:
                    break

                # Input Transcription.
                input_transcription = server_content.pop("inputTranscription", None)
                if input_transcription is not None:
                  raw_text = input_transcription.pop("text", None)
                  if raw_text is not None:
                    display(Markdown(f"**Input >** {raw_text}"))

                # Output Transcription.
                output_transcription = server_content.pop("outputTranscription", None)
                if output_transcription is not None:
                  raw_text = output_transcription.pop("text", None)
                  if raw_text is not None:
                    display(Markdown(f"**Response >** {raw_text}"))

                model_turn = server_content.pop("modelTurn", None)
                if model_turn is not None:
                    parts = model_turn.pop("parts", None)
                    if parts is not None:
                        for part in parts:
                            pcm_data = base64.b64decode(part["inlineData"]["data"])
                            overall_responses.append(np.frombuffer(pcm_data, dtype=np.int16))

                # End of turn
                # turn_complete = server_content.pop("turnComplete", None)
                # if turn_complete:
                #     break
            except asyncio.TimeoutError:
                print(f"Timeout: No response received from the websocket within {timeout_seconds} seconds.")
                if overall_responses:
                  display(Audio(np.concatenate(overall_responses), rate=24000, autoplay=True))
                break # Exit the loop on timeout
            except websockets.exceptions.ConnectionClosed as e:
              print(f"Connection closed by exception, code: {e.code}, reason: {e.reason}")
              if overall_responses:
                display(Audio(np.concatenate(overall_responses), rate=24000, autoplay=True))
              break # Exit the loop on connection closed
            except Exception as e:
              print(f"An unexpected error occurred: {e}")
              if overall_responses:
                display(Audio(np.concatenate(overall_responses), rate=24000, autoplay=True))
              break # Exit the loop on other exceptions

    finally:
        try:
          await ws.close(code=1000, reason="Normal closure") #example close
        except websockets.exceptions.ConnectionClosed as e:
          print(f"Connection closed by exception, code: {e.code}, reason: {e.reason}")
        except Exception as e:
          print(f"An unexpected error occurred: {e}")

サポートされている言語

言語コード 言語
aaアファール
abアブハズ語
aceアチェ語
achアチョリ語
afアフリカーンス語
akアカン語
alzアルール語
amアムハラ語
anアラゴン語
arアラビア語
asアッサム語
avアヴァル語
awaアワディー語
ayアイマラ語
azアゼルバイジャン語
baバシキール語
balバルーチー語
banバリ語
bbcバタクトバ語
bciバウレ語
beベラルーシ語
bemベンバ語
berベルベル語
bewベタウィ語
bgブルガリア語
bgcハリヤーンウィー語
bhoボージュプリー語
biビスラマ語
bmバンバラ語
bnベンガル語
boチベット語
brブルトン語
bsボスニア語
btsバタク シマルングン語
btxバタク カロ語
caカタルーニャ語
ceチェチェン語
cebセブアノ語
cggチガ語
chチャモロ語
chkチューク語
cmn標準中国語
cnhハカ チン語
coコルシカ語
crクリー語
crhクリミア タタール語
crsセーシェル クレオール フランス語
csチェコ語
cvチュヴァシ語
cyウェールズ語
daデンマーク語
deドイツ語
dinディンカ語
doiドグリ語
dovドンベ語
dvディベヒ語
dyuジュラ語
dzゾンカ語
eeエウェ語
elギリシャ語
en英語
eoエスペラント語
esスペイン語
etエストニア語
euバスク語
faペルシア語
ffフラニ語
fiフィンランド語
filフィリピン語
fjフィジー語
foフェロー語
fonフォン語
frフランス語
furフリウリ語
fy西フリジア語
gaアイルランド語
gaaガ語
gdゲール語
glガリシア語
gnグアラニ語
guグジャラート語
gvマン島語
haハウサ語
hawハワイ語
heヘブライ語
hiヒンディー語
hilヒリガイノン語
hmnモン語
hoヒリモツ語
hrクロアチア語
hrxフンスリュック語
htハイチ語、ハイチ クレオール語
huハンガリー語
hyアルメニア語
hzヘレロ語
ibaイバン語
idインドネシア語
igイボ語
iloイロカノ語
isアイスランド語
itイタリア語
iuイヌクティトゥト語
ja日本語
jamジャマイカ クレオール英語
jvジャワ語
kaジョージア語
kacカチン語
kekケクチ語
kgコンゴ語
khaカーシ語
kiキクユ語
kjクワニャマ語
kkカザフ語
klグリーンランド語
km中央クメール語
knカンナダ語
ko韓国語
kokコンカニ語
krカヌリ語
kriクリオ語
ksカシミール語
ktuキトゥバ語
kuクルド語
kvコミ語
kwコーンウォール語
kyキルギス語
laラテン語
lbルクセンブルク語
lgガンダ語
liリンブルフ語
lijリグリア語
lmoロンバルド語
lnリンガラ語
loラオ語
ltリトアニア語
luルバカタンガ語
luaルバルルア語
luoDholuo
lusミゾ語
lvラトビア語
madマドゥラ語
maiマイティリー語
makマカッサル語
mamマム語
mfeモーリシャス語
mgマダガスカル語
mhマーシャル語
minミナンカバウ語
mkマケドニア語
mlマラヤーラム語
mnモンゴル語
mrマラーティー語
msマレー語
mtマルタ語
mwrマールワーリー語
myビルマ語
naナウル
nbノルウェー語[ブークモール]
nd北ンデベレ語
ndcンダウ語
neネパール語
newネワール語
ngンドンガ語
nheウアステカナワトル語
nlオランダ語
nnノルウェー語(ニーノシク)
nr南ンデベレ語
nsoペディ語
nusヌエル語
nvナヴァホ語
nyチェワ語
ocオック語
ojオジブワ語
omオロモ語
orオリヤー語
osオセット語
paパンジャブ語
pagパンガシナン
pamパンパンガ
papパピアメント語
plポーランド語
psパシュト語
ptポルトガル語
quケチュア語
rmロマンシュ語
rnルンディ語
roルーマニア語
ruロシア語
rwキニヤルワンダ語
saサンスクリット
sahヤクート語
satサンタル語
scサルデーニャ語
scnシチリア語
sdシンド語
se北サーミ語
sgサンゴ語
shnシャン語
siシンハラ語
skスロバキア語
slスロベニア語
smサモア語
snショナ語
soソマリ語
sqアルバニア語
srセルビア語
ssスワート語
st南ソト語
suスンダ語
svスウェーデン語
swスワヒリ語
szlシレジア語
taタミル語
tcyトゥル語
teテルグ語
tetテトゥン語
tgタジク語
thタイ語
tiティグリニャ語
tivティブ語
tkトルクメン語
tlタガログ語
tnツワナ語
toトンガ
tpiトクピシン語
trトルコ語
trpコクバラ語
tsツォンガ語
ttタタール語
tumトゥンブカ語
twトゥイ語
tyタヒチ語
tyvトゥバ語
udmウドムルト語
ugウイグル語
ukウクライナ語
urウルドゥー語
uzウズベク語
veヴェンダ語
vecヴェネト語
viベトナム語
waワロン語
warワライ語
woウォロフ語
xhコーサ語
yiイディッシュ語
yoヨルバ語
yuaユカテコマヤ語
yue広東語
zaチワン語
zh中国語
zuズールー語

課金

音声翻訳は試験運用版の機能であるため、使用しても料金は発生しません。

料金と請求の詳細については、Vertex AI の料金をご覧ください。