Usar a tradução de voz para voz

A funcionalidade de tradução de voz para voz usa IA para interpretar a linguagem, o que permite conversas entre indivíduos e sistemas que falam idiomas diferentes. A sua aplicação pode usar esta funcionalidade para processar uma stream de áudio que contenha voz num idioma e traduzi-la para outro idioma em tempo real.

Ao contrário de outras funcionalidades da API Live que suportam conversas baseadas em turnos, a tradução de voz para voz processa continuamente a entrada de áudio e transmite os seguintes resultados à medida que ficam disponíveis:

  • Transcrição: o texto reconhecido a partir do fluxo de áudio de entrada no idioma original.
  • Tradução: o texto traduzido no idioma de destino.
  • Áudio sintetizado: uma stream de áudio do texto traduzido falado no idioma de destino que corresponde à voz do orador original.

Modelos suportados

Pode usar a tradução de voz para voz com o seguinte modelo:

Versão do modelo Nível de disponibilidade
gemini-2.5-flash-s2st-exp-11-2025 Experimental privado

Requisitos de áudio de entrada

A tradução de voz para voz só suporta entrada de áudio. Para obter informações sobre os formatos de áudio, os codecs e as especificações suportados, como a taxa de amostragem, consulte o artigo Formatos de áudio suportados.

Use a tradução de voz para voz

Para usar a tradução de voz para voz, consulte os seguintes exemplos de código:

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}")

Idiomas suportados

Código de idioma Idioma
aaAfar
abAbcaze
aceAchinês
achAcoli
afAfrikaans
akAkan
alzAlur
da manhãAmárico
anAragonês
arÁrabe
comoAssamês
avAvar
awaAwadhi
ayAimará
azAzeri
baBashkir
balBalúchi
banirBalinês
bbcBataque toba
bciBaoulé
beBielorrusso
bemBemba
berBerbere
bewBetawi
bgBúlgaro
bgcHaryanvi
bhoBhojpuri
biBislama
bmBambara
bnBengali
boTibetano
brBretão
bsBósnio
btsBataque simalungun
btxBataque karo
caCatalão
ceChecheno
cebCebuano
cggChiga
chChamorro
chkChuquês
cmnChinês mandarim
cnhHakha chin
coCorso
crCree
crhTártaro da Crimeia
crsFrancês crioulo das Seicheles
csChéquia
cvChuvache
cyGalês
daDinamarquês
deAlemão
dinDinca
doiDogri
dovDombe
dvDivehi
dyuDiúla
dzDzongkha
eeEwe
elGrego
pt-PTInglês
eoEsperanto
esEspanhol
etEstónio
euBasco
faFarsi
ffFula
fiFinlandês
filFilipino
fjFijiano
foFaroé
fonFon
frFrancês
peloFriuliano
fyFrísico ocidental
gaIrlandês
gaaGa
gdGaélico
glGalego
gnGuarani
guGujarati
gvManquês
haHaúça
hawHavaiano
eleHebraico
hiHindi
hilHiligaynon
hmnHmong
hoHiri motu
hrCroata
hrxHunsrik
htHaitiano, crioulo haitiano
huHúngaro
hyArménio
hzHerero
ibaIban
idIndonésio
igIgbo
iloIlocano
éIslandês
itItaliano
iuInuktitut
jaJaponês
jamInglês crioulo jamaicano
jvJavanês
kaGeorgiana
kacKachin
kekKekchi
kgConguês
khaKhasi
kiKikuyu
kjCuanhama
kkCazaque
klGroenlandês
kmKhmer central
knCanará
koCoreano
kokConcani
krKanuri
kriKrio
ksCaxemirense
ktuKituba
kuCurdo
kvKomi
kwCórnico
kyQuirguize
laLatim
lbLuxemburguês
lgGanda
liLimburguês
lijLiguriano
lmoLombardo
lnLingala
loLaosiano
ltLituânia
luLuba-katanga
luaLuba-Lulua
luoDholuo
lusMizo
lvLetão
loucoMadurês
maiMaitíli
makMakasar
mamMam
mfeCrioulo das Ilhas Maurícias
mgMalgaxe
mhMarshalês
minMinangkabau
mkMacedónio
mlMalaiala
mnMongol
mrMarati
msMalaio
mtMaltês
mwrMarwari
myBirmanês
N/ANauru
nbbokmål norueguês
ndNdebele do norte
ndcXindau
neNepalês
novoNewari
ngNdonga
nheNáuatle da Huasteca Oriental
nlNeerlandês
nnNorueguês (Nynorsk)
nrNdebele do sul
nsoPedi
nusNuer
nvNavajo
nyCinianja
ocOccitânico
ojOjíbua
omOromo
ouOriya
osOsseta
paPunjabi
pagPangasinês
pamPampanga
papPapiamento
plPolaco
psPastó
ptPortuguês
quQuíchua
rmRomanche
rnRundi
roRomeno
ruRusso
rwKinyarwanda
saSânscrito
sahIacuto
sábSantali
scSardo
scnSiciliano
sdSindi
seSami do Norte
sgSango
shnShan
siCingalês
skEslovaco
slEsloveno
smSamoano
snShona
soSomália
sqAlbanês
srSérvio
ssSuazi
stSesoto
suSundanês
svSueco
swSuaíli
szlSilesiano
taTamil
tcyTulu
teTelugu
tetTétum
tgTajique
thTailandês
tiTigrínia
tivTive
tkTurcomenistão
tlTagalo
tnTsuana
aTonga
tpiTok pisin
trTurco
trpKok borok
tsTsonga
ttTártaro
tumTumbuka
twTwi
tyTaitiano
tyvTuviniano
udmUdmurte
ugUigure
ukUcraniano
urUrdu
uzUsbeque
veVenda
vecVeneziano
viVietnamita
waValão
guerraWaray
woJalofo
xhXhosa
yiIídiche
yoIorubá
yuaIucateque maia
yueCantonês
zaZhuang
zhChinês
zuZulu

Faturação

Como funcionalidade experimental, não lhe é cobrado qualquer valor pela utilização da tradução de voz para voz.

Para mais informações sobre preços e faturação, consulte a secção Preços do Vertex AI.