使用语音转语音翻译

语音转语音翻译功能使用 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亚齐语
achAcoli
af南非荷兰语
akAkan
alz阿卢尔语
上午阿姆哈拉语
an阿拉贡语
ar阿拉伯语
as阿萨姆语
av阿瓦尔语
awa阿瓦德语
ay艾马拉语
az阿塞拜疆语
ba巴什基尔语
bal俾路支语
ban巴厘文
bbc巴塔克托巴语
bci巴乌雷语
be白俄罗斯语
bemBemba
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德语
dinDinka
doi多格来语
dov敦贝语
dv第维埃语
dyu迪尤拉语
dz宗卡语
ee埃维语
el希腊语
en英语
eo世界语
es西班牙语
et爱沙尼亚语
eu巴斯克语
faFarsi
ff富拉语
fi芬兰语
fil菲律宾语
fj斐济语
fo法罗语
fonFon
fr法语
fur弗留利语
fy西弗里西亚语
ga爱尔兰语
gaa加语
gd盖尔语
gl加利西亚语
gn瓜拉尼人
gu古吉拉特语
gv马恩岛语
ha豪萨语
haw夏威夷语
he希伯来语
hi印地语
hil希利盖农语
hmn苗语
ho希里莫图语
小时克罗地亚语
hrx洪斯吕克语
ht海地语、海地克里奥尔语
hu匈牙利语
hy亚美尼亚语
hzHerero
ibaIban
id印度尼西亚语
igIgbo
ilo伊洛果语
冰岛语
it意大利语
iu因纽特语
ja日语
Jam牙买加克里奥尔英语
jv爪哇语
ka格鲁吉亚语
kac克钦语
kek凯克其语
kg刚果语
kha卡西语
ki吉库尤语
kj宽尼亚玛语
kk哈萨克语
kl格陵兰语
公里中部高棉语
kn卡纳达语
ko韩语
kok贡根语
krKanuri
kri克里奥尔语
ks克什米尔语
ktu吉土巴语
ku库尔德语
kv科米语
kw康沃尔语
ky吉尔吉斯语
la拉丁语
lb卢森堡语
lgGanda
li林堡语
lij利古里亚语
lmo伦巴第语
ln林加拉语
lo老挝语
lt立陶宛语
lu卢巴加丹加语
lua鲁巴-鲁鲁拉 (Luba-Lulua) 语
luoDholuo
lus米佐语
lv拉脱维亚语
mad马都拉语
mai迈蒂利语
makMakasar
mamMam
mfe莫里森语
mg马尔加什语
mh马绍尔语
分钟米南佳保语
mk马其顿语
ml马拉雅拉姆语
mn蒙古语
mr马拉地语
毫秒马来语
mt马耳他语
mwr马尔瓦里语
my缅甸语
不适用瑙鲁
nb挪威博克马尔语
nd北恩德贝勒语
ndc恩道语
ne尼泊尔语
new尼瓦尔语
ng恩东加语
nhe东部瓦斯特卡纳胡阿特尔语
nl荷兰语
nn挪威语(尼诺斯克语)
nr南恩德贝勒语
nso塞佩蒂语
nus努尔语
nv纳瓦霍语
ny齐切瓦语
oc奥克斯坦语
oj奥杰布瓦语
om奥罗莫语
奥里亚语
os奥塞特语
pa旁遮普语
pag邦阿西楠语
pam邦板牙语
pap帕皮阿门托语
pl波兰语
ps普什图语
pt葡萄牙语
qu克丘亚语
rm罗曼什语
rn隆迪语
ro罗马尼亚语
ru俄语
rw卢旺达语
sa梵语
sah雅库特语
sat桑塔利语
sc撒丁尼亚语
scn西西里语
sd信德语
se北萨米语
sgSango
shn掸语
si僧伽罗语
sk斯洛伐克语
sl斯洛文尼亚语
sm萨摩亚语
sn修纳语
so索马里语
sq阿尔巴尼亚语
sr塞尔维亚语
ss斯瓦特语
st南索托语
su巽他语
sv瑞典语
sw斯瓦希里语
szl西里西亚语
ta泰米尔语
tcy图鲁语
te泰卢固语
tet德顿语
tg塔吉克语
th泰语
ti提格里尼亚语
提夫语提夫语
tk土库曼语
tl塔加路语
tn茨瓦纳语
to汤加
tpi巴布亚皮钦语
tr土耳其语
trp廓克博若克语
ts聪加语
tt鞑靼语
tum图姆布卡语
tw契维语
ty塔希提语
tyv图瓦语
udm乌德穆尔特语
ug维吾尔语
uk乌克兰语
ur乌尔都语
uz乌兹别克语
veVenda
vec威尼斯语
vi越南语
wa瓦隆语
war瓦雷语
woWolof
xh科萨语
yi意第绪语
yo约鲁巴语
yua尤卡坦玛雅语
yue粤语
za壮语
zh中文
zu祖鲁语

结算

作为一项实验性功能,您无需付费即可使用语音转语音翻译。

如需详细了解价格和结算,请参阅 Vertex AI 价格