Como usar a tradução de fala para fala

O recurso de tradução de fala para fala usa IA para interpretar idiomas, permitindo conversas entre pessoas e sistemas que falam línguas diferentes. Seu aplicativo pode usar esse recurso para processar um fluxo de áudio que contém fala em um idioma e traduzir para outro em tempo real.

Ao contrário de outros recursos da API Live que oferecem suporte a conversas baseadas em turnos, a tradução de voz para voz processa continuamente a entrada de áudio e transmite as seguintes saídas à medida que elas ficam disponíveis:

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

Modelos compatíveis

É possível 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 particular

Requisitos de áudio de entrada

A tradução de voz para voz só aceita entrada de áudio. Para informações sobre formatos de áudio, codecs e especificações compatíveis, como taxa de amostragem, consulte Formatos de áudio compatíveis.

Usar a tradução simultânea

Para usar a tradução de fala para fala, 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 compatíveis

Código do idioma Idioma
aaAfar
abAbcasiano
aceAchém
achAcoli
afAfricâner
akAcã
alzAlur
da manhãAmárico
umaAragonês
arÁrabe
asAssamês
avAvaric
awaAwadhi
ayAimará
azAzerbaijano
baBashkir
balBalúchi
banBalinês
bbcBatak toba
bciBaoulé
beBielorrusso
bemBemba
berBerbere
bewBetawi
bgBúlgaro
bgcHariani
bhoBoiapuri
biBislama
bmBambara
bnBengalês
boTibetano
brBretão
bsBósnio
btsBatak simalungun
btxBatak karo
acCatalão
ceChecheno
cebCebuano
cggChiga
chChamorro
chkChuukês
cmnMandarim (China)
cnhHakha Chin
coCórsico
crCree
crhTártaro da Crimeia
crsFrancês crioulo de Seychelles
csTcheco
cvChuvache
cyGalês
daDinamarquês
deAlemão
dinDinca
doiDogri
dovDombe
dvDiveí
dyuDiúla
dzDzonga
eeEwe
elGrego
enInglês
eoEsperanto
esEspanhol
etEstoniano
euBasco
faFarsi
ffFulah
fiFinlandês
filFilipino
fjFijiano
foFaroês
fonFon
frFrancês
pelosFriulana
fyFrísio ocidental
gaIrlandês
gaaGa
gdGaélico
glGalego
gnGuarani
guGujarati
gvManx
haHauçá
hawHavaiano
heHebraico
hiHindi
hilHiligaynon
hmnHmong
hoHiri Motu
hCroata
hrxHunsrik
htCrioulo haitiano
huHúngaro
hyArmênio
hzHerero
ibaIban
IDIndonésio
igIgbo
iloIloko
éIslandês
itItaliano
iuInuctitut
jaJaponês
JamCrioulo inglês da Jamaica
jvJavanês
kaGeorgiano
kacKachin
kekKekchi
kgQuicongo
khaKhasi
kiKikuyu
kjKuanyama
kkCazaque
klGroenlandês
kmKhmer central
knCanará
koCoreano
kokConcani
krKanuri
kriKrio
ksCaxemira
ktuKituba
kuCurdo
kvKomi
kwCornish
kyQuirguiz
laLatim
lbLuxemburguês
lgGanda
liLimburguês
lijLígure
lmoLombardo
lnLingala
loLaosiano
ltLituano
luLuba-katanga
luaLuba-lulua
luoDholuo
lusMizo
lvLetão
madMadurês
maiMaithili
makMakasar
mamMam
mfeMorisyen
mgMalgaxe
mhMarshallese
minMinangkabau
mkMacedônio
mlMalaiala
mnMongol
mrMarati
msMalaio
mtMaltês
mwrMarwari
myBirmanês
naNauru
nbbokmål norueguês
ndNdebele do norte
ndcNdau
neNepalês
novoNewari
ngNdonga
nheNahuatl da Huasteca oriental
nlHolandês
nnNorueguês (Nynorsk)
nrNdebele do sul
nsoPedi
nusNuer
nvNavarro
nyChicheua
ocOccitano
ojOjibwa
omOromo
ouOriá
osOsseta
paPunjabi
pagLíngua pangasiana
pamPampanga
papPapiamento
plPolonês
psPastó
ptPortuguês
quQuíchua
rmRomanche
rnRundi
roRomeno
ruRusso
rwQuiniaruanda
saSânscrito
sahIacuto
sentouSantali
scSardo
scnSiciliano
sdSindi
seSami setentrional
sgSango
shnShan
siCingalês
skEslovaco
slEsloveno
smSamoano
snChona
soSomali
sqAlbanês
srSérvio
ssSwati
stSoto do sul
suSudanês
svSueco
swSuaíli
szlSilesiano
taTâmil
tcyTulu
teTélugo
tetTétum
tgTadjique
thTailandês
tiTigrínia
tivTiv
tkTurcomano
tlTagalo
tnTswana
aTonga
tpiTok pisin
trTurco
trpKokborok
tsTsonga
ttTártaro
barrigaTumbuka
twTwi
tyTaitiano
tyvTuviniano
udmUdmurte
ugUigur
ukUcraniano
urUrdu
uzUzbeque
veVenda
vecVêneto
viVietnamita
waValão
guerraWaray
woWolof
xhXhosa
yiÍdiche
yoIorubá
yuaIucateque
yueCantonês
zaZhuang
zhChinês
zuZulu

Faturamento

Como é um recurso experimental, não há cobranças pelo uso da tradução de voz para voz.

Para mais informações sobre preços e faturamento, consulte Preços da Vertex AI.