使用語音轉語音翻譯

語音對語音翻譯功能會運用 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阿盧爾語
上午阿姆哈拉文
一個亞拉岡文
ar阿拉伯文
as阿薩姆文
av阿瓦爾文
awa阿瓦德語
ay艾馬拉文
az亞塞拜然文
ba巴什噶爾語
bal俾路支文
封鎖峇里文
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多姆貝語 (Dombe)
dv迪維西文
dyu迪烏拉文
dz宗喀語
ee埃維文
el希臘文
en英文
eo世界文
es西班牙文
et愛沙尼亞文
eu巴斯克文
fa波斯文
ff富拉文
fi芬蘭文
fil菲律賓文
fj斐濟語
fo法羅語
fon豐文
fr法文
毛皮佛里烏利文
fy西弗里西亞文
正式發布版愛爾蘭文
gaa加語
gd蓋爾文
gl加里西亞文
gn瓜拉尼文
gu古吉拉特文
gv曼島文
ha豪薩文
haw夏威夷文
希伯來文
北印度文
hil希里蓋農語
hmn苗文
ho希里摩圖文
小時克羅埃西亞文
hrx亨斯里克語
ht海地文、海地克里奧文
hu匈牙利文
hy亞美尼亞文
hzHerero
iba伊邦文
id印尼文
ig伊博文
ilo伊洛果語
冰島文
it義大利文
iu伊努伊特文
ja日文
jam牙買加克里奧爾英文
jv爪哇文
ka喬治亞文
kac克欽文
kek凱克奇文
公斤剛果文
kha卡西文
ki基庫猶文
kjKuanyama
kk哈薩克文
kl格陵蘭文
公里中部高棉文
kn卡納達文
ko韓文
kok貢根文
kr卡努里文
kri克里奧文
ks喀什米爾文
ktu基圖巴語 (Kituba)
ku庫德文
kv科米文
kw康瓦耳文
ky吉爾吉斯文
la拉丁文
lb盧森堡文
lg干達文
li林堡語
lij利古里亞文
lmo倫巴底語
ln林格拉文
lo寮文
lt立陶宛文
lu盧巴卡坦加文
lua盧巴-盧拉文
luo盧歐文
lus米佐文
lv拉脫維亞文
生氣馬都拉文
mai邁蒂利文
makMakasar
mamMam
mfe模里西斯文
mg馬達加斯加文
mh馬紹爾文
分鐘米南佳保文
mk馬其頓文
ml馬拉雅拉姆文
mn蒙古文
mr馬拉地文
毫秒馬來文
mt馬耳他文
mwr馬瓦麗文
my緬甸文
na諾魯
nb挪威波克默爾文
nd北恩德貝萊文
ndc尼道文
ne尼泊爾文
新推出尼瓦爾文
ng恩東佳文
nhe東瓦斯特克納瓦特爾文
nl荷蘭文
nn挪威文 (耐諾斯克)
nr南恩德貝勒文
nsoPedi
nus努爾語
nv納瓦伙文
ny齊切瓦語
oc奧克語
oj歐及布威文
om奧羅莫文
奧里雅語
os奧塞提文
pa旁遮普文
pag邦阿西楠語
pam邦板牙
pap帕皮阿門多語
pl波蘭文
ps普什圖文
pt葡萄牙文
qu克丘亞文
rm羅曼斯文
rn基隆迪語
ro羅馬尼亞文
ru俄文
rw盧安達文
sa梵文
sah雅庫特文
週六桑塔利文
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札那語
東加
tpi巴布亞皮欽文
tr土耳其文
trp廓博羅克文
ts宗卡文
tt韃靼文
tum圖姆布卡文
tw契維語
ty塔希提文
tyv圖瓦文
udm烏德穆爾特文
ug維吾爾語
uk烏克蘭文
ur烏都文
uz烏茲別克文
ve溫達文
vec威尼斯文
vi越南文
wa瓦隆文
戰爭瓦瑞文
wo沃洛夫文
xh科薩文
yi意第緒語
yo約魯巴文
yua猶加敦馬雅語
yue粵語
za壯文
zh中文
zu祖魯文

帳單

這項功能目前為實驗功能,因此使用語音對語音翻譯功能不會產生費用。

如要進一步瞭解定價和帳單,請參閱 Vertex AI 定價