Menggunakan terjemahan speech-to-speech

Fitur terjemahan speech-to-speech menggunakan AI untuk menafsirkan bahasa, sehingga memungkinkan percakapan antara individu dan sistem yang menggunakan bahasa yang berbeda. Aplikasi Anda dapat menggunakan fitur ini untuk memproses aliran audio yang berisi ucapan dalam satu bahasa dan menerjemahkannya ke dalam bahasa lain secara real time.

Tidak seperti fitur Live API lainnya yang mendukung percakapan berbasis giliran, terjemahan ucapan ke ucapan terus memproses input audio dan melakukan streaming output berikut saat tersedia:

  • Transkripsi: Teks yang dikenali dari aliran audio input dalam bahasa asli.
  • Terjemahan: Teks yang diterjemahkan dalam bahasa target.
  • Audio yang disintesis: Aliran audio dari teks terjemahan yang diucapkan dalam bahasa target yang cocok dengan suara penutur asli.

Model yang didukung

Anda dapat menggunakan terjemahan speech-to-speech dengan model berikut:

Versi model Tingkat ketersediaan
gemini-2.5-flash-s2st-exp-11-2025 Eksperimental pribadi

Persyaratan audio input

Terjemahan ucapan ke ucapan hanya mendukung input audio. Untuk mengetahui informasi tentang format audio, codec, dan spesifikasi yang didukung seperti frekuensi sampel, lihat Format audio yang didukung.

Menggunakan terjemahan speech-to-speech

Untuk menggunakan terjemahan speech-to-speech, lihat contoh kode berikut:

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

Bahasa yang didukung

Kode Bahasa Bahasa
aaAfar
abAbkhaz
aceAceh
achAcoli
afAfrika
akAkan
alzAlur
amAmhara
anAragon
arArab
sebagaiAssam
avAvar
awaAwadhi
ayAymara
azAzerbaijani
baBashkir
balBaluchi
laranganBali
bbcBatak Toba
bciBaoulé
beBelarusia
bemBemba
berBerber
bewBetawi
bgBulgaria
bgcHaryanvi
bhoBhojpuri
biBislama
bmBambara
bnBengali
boTibet
brBreton
bsBosnia
btsBatak Simalungun
btxBatak Karo
caCatalan
ceSuku Chechen
cebCebuano
cggChiga
chChamorro
chkChuuk
cmnChina Mandarin
cnhHakha Chin
coKorsika
crCree
crhCrimean Tatar
crsPrancis Kreol Seselwa
csCeko
cvChuvash
cyWales
daDenmark
deJerman
dinDinka
doiDogri
dovDombe
dvDivehi
dyuDyula
dzDzongkha
eeEwe
elYunani
idInggris
eoEsperanto
esSpanyol
etEstonia
euBasque
faFarsi
ffFulah
fiFinlandia
filFilipina
fjFiji
foFaroese
fonFon
frPrancis
buluFriuli
fyFrisia Barat
gaIrlandia
gaaGa
gdGaelig
glGalisia
gnGuarani
guGujarati
gvManx
haHausa
hawHawaii
heIbrani
hiHindi
hilHiligaynon
hmnHmong
hoHiri Motu
jamKroasia
hrxHunsrik
htHaiti, Kreol Haiti
huHungaria
hyArmenia
hzHerero
ibaIban
idIndonesia
igIgbo
iloIloko
adalahIslandia
itItalia
iuInuktitut
jaJepang
jamBahasa Inggris Kreol Jamaika
jvJawa
kaGeorgia
kacKachin
kekKekchi
kgKongo
khaKhasi
kiKikuyu
kjKuanyama
kkKazak
klGreenland
kmKhmer Tengah
knKannada
koKorea
kokKonkani
krKanuri
kriKrio
ksKashmiri
ktuKituba
kuKurdi
kvKomi
kwKernowek
kyKyrgyz
laLatin
lbLuksemburg
lgGanda
liLimburgia
lijLiguria
lmoLombard
lnLingala
loLaos
ltLituania
luLuba-Katanga
luaLuba-Lulua
luoDholuo
lusMizo
lvLatvia
marahMadura
maiMaithili
makMakasar
mamMam
mfeMorisyen
mgMalagasi
mhMarshall
mntMinangkabau
mkMakedonia
mlMalayalam
mnMongolia
mrMarathi
mdMelayu
mtMalta
mwrMarwari
myMyanmar
tidak adaNauru
nbBokmål Norwegia
ndNdebele Utara
ndcNdau
neNepal
baruNewari
ngNdonga
nheNahuatl Huasteca Timur
nlBelanda
nnNynorsk Norwegia
nrNdebele Selatan
nsoPedi
nusNuer
nvNavajo
nyChichewa
ocOccitan
ojOjibwa
omOromo
atauOriya
osOssetia
paPunjabi
pagPangasinan
pamPampanga
papPapiamento
plPolandia
psPashto
ptPortugis
quQuechua
rmRomansh
rnRundi
roRumania
ruRusia
rwKinyarwanda
saSanskrit
sahYakut
sabSantali
scSardinia
scnSisilia
sdSindhi
seSami Utara
sgSango
shnShan
siSinhala
skSlovak
slSlovenia
smSamoa
snShona
soSomali
sqAlbania
srSerbia
ssSwati
stSotho Selatan
suSunda
svSwedia
swSwahili
szlSilesia
taTamil
tcyTulu
teTelugu
tetTetun
tgTajik
thThai
tiTigrinya
tivTiv
tkTurkmen
tlTagalog
tnTswana
sampaiTonga
tpiTok Pisin
trTurki
trpKok Borok
tsTsonga
ttTatar
tumTumbuka
twTwi
tyTahiti
tyvTuva
udmUdmurt
ugUighur
ukUkraina
urUrdu
uzUzbekistan
veVenda
vecVenetian
viVietnam
waWalloon
perangWaray
woWolof
xhXhosa
yiYiddish
yoYoruba
yuaMaya Yukatek
yueKanton
zaZhuang
zhChina
zuZulu

Penagihan

Sebagai fitur eksperimental, Anda tidak akan dikenai biaya untuk menggunakan terjemahan ucapan ke ucapan.

Untuk mengetahui informasi selengkapnya tentang harga dan penagihan, lihat Harga Vertex AI.