Usar la traducción de voz a voz

La función de traducción de voz a voz usa la IA para interpretar idiomas, lo que permite mantener conversaciones entre personas y sistemas que hablan idiomas diferentes. Tu aplicación puede usar esta función para procesar un flujo de audio que contenga voz en un idioma y traducirlo a otro idioma en tiempo real.

A diferencia de otras funciones de la API Live que admiten conversaciones por turnos, la traducción de voz a voz procesa continuamente la entrada de audio y transmite las siguientes salidas a medida que están disponibles:

  • Transcripción: el texto reconocido de la transmisión de audio de entrada en el idioma original.
  • Traducción: el texto traducido al idioma de destino.
  • Audio sintetizado: una secuencia de audio del texto traducido en el idioma de destino que coincide con la voz del orador original.

Modelos admitidos

Puedes usar la traducción de voz a voz con el siguiente modelo:

Versión del modelo Nivel de disponibilidad
gemini-2.5-flash-s2st-exp-11-2025 Experimental privada

Requisitos de audio de entrada

La traducción de voz a voz solo admite la entrada de audio. Para obtener información sobre los formatos de audio, los códecs y las especificaciones admitidos, como la frecuencia de muestreo, consulta Formatos de audio admitidos.

Usar la traducción de voz a voz

Para usar la traducción de voz a voz, consulta los siguientes ejemplos 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 disponibles

Código de idioma Idioma
aaAfar
abAbjaso
aceAcehnés
achacholi
afAfrikáans
akAcano
alzAlur
a.m.Amárico
anAragonés
arÁrabe
comoAsamés
avAvaric
awaAwadhi
ayAimara
azAzerí
baBaskir
balBaluchi
bloquearBalinés
bbcBatak toba
BCIBaoulé
beBielorruso
bemBemba
berBereber
bewBetawi
bgBúlgaro
bgcHariyanvi
bhoBhoyapurí
biBislama
bmBambara
bnBengalí
boTibetano
brBretón
bsBosnio
btsBatak Simalungun
btxBatak Karo
caCatalán
ceChecheno
cebCebuano
cggChiga
chChamorro
chkTrukés
cmnChino mandarín
cnhChin de Hakha
coCorso
crCree
crhTártaro de Crimea
crsCriollo seychellense
csCheco
cvChuvasio
cyGalés
daDanés
deAlemán
dinDinka
doiDogri
dovDombe
dvDivehi
dyuDiula
dzDzongkha
eeEwé
elGriego
esInglés
eoEsperanto
esEspañol
etEstonio
euEuskera
faFarsi
ffFula
fiFinés
filFilipino
fjFiyiano
foFeroés
fonFon
frFrancés
peloFriulano
fyFrisón occidental
gaIrlandés
gaaga
gdGaélico
glGallego
gnGuaraní
guGuyaratí
gvGaélico manés
haHausa
hawHawaiano
heHebreo
holaHindi
hilHiligainón
hmnHmong
hoHiri motu
hCroata
hrxHunsrik
htHaitiano, criollo haitiano
huHúngaro
hyArmenio
hzHerero
ibaIban
idIndonesio
igIgbo
iloIlocano
esIslandés
itItaliano
iuInuktitut
jaJaponés
jamInglés criollo jamaicano
jvJavanés
kaGeorgiano
kacKachin
kekQuekchí
kgKikongo
khaKhasi
kiKikuyu
kjKuanyama
kkKazajo
klGroenlandés
kmJemer central
knCanarés
koCoreano
kokKonkani
krKanuri
kriKrio
ksCachemir
ktuKituba
kuKurdo
kvKomi
kwCornuallés
kyKirguís
laLatín
lbLuxemburgués
lgluganda
liLimburgués
lijLigur
lmoLombardo
lnLingala
loLao
ltLituano
luLuba-katanga
lualuba-lulua
luoDholuo
lusMizo
lvLetón
enfadadoMadurés
maiMaithili
makMakasar
mamMam
mfecriollo mauriciano
mgMalgache
mhMarshalés
minMinangkabau
mkMacedonio
mlMalabar
mnMongol
mrMarathi
msMalayo
mtMaltés
mwrMarwari
myBirmano
naNauru
nbbokmal noruego
Ndebele del norte
ndcNdau
neNepalí
nuevoNewarí
ngNdonga
nheNáhuatl de la Huasteca oriental
nlneerlandés
nnNoruego (Nynorsk)
nrNdebele del Sur
nsoPedi
nusNuer
nvNavajo
nyChichewa
ocOccitano
ojOjibwa
omOromo
oOriya
osOsetio
paPanyabí
pagPangasinán
pamPampanga
papPapiamento
plPolaco
psPastún
ptPortugués
quQuechua
rmRomanche
rnKirundi
roRumano
ruRuso
rwKinyarwanda
saSánscrito
sahYakuto
sáb.Santali
scSardo
scnSiciliano
sdSindhi
seSami septentrional
sgSango
shnShan
siCingalés
skEslovaco
slEsloveno
smSamoano
snShona
así queSomalí
sqAlbanés
srSerbio
ssSuazi
stSesoto austral
suSundanés
svSueco
swSwahili
szlSilesio
taTamil
tcyTulu
teTelugú
tetTetun
tgTayiko
thTailandés
tiTigrinya
tivTiv
tkTurkmeno
tlTagalo
tnSetsuana
aTonga
tpiTok pisin
trTurco
trpKokborok
tsTsonga
ttTártaro
tumTumbuka
twTwi
tyTahitiano
tyvTuviniano
udmUdmurt
ugUiguro
ukUcraniano
urUrdu
uzUzbeko
veVenda
vecVeneciano
viVietnamita
waValón
guerraSamareño
woWolof
xhXhosa
yiYiddish
yoYoruba
yuaMaya yucateco
yueCantonés
zaZhuang
zhChino
zuZulú

Facturación

Como se trata de una función experimental, no se te cobrará por usar la traducción de voz a voz.

Para obtener más información sobre los precios y la facturación, consulta los precios de Vertex AI.