음성 간 번역 사용

음성 간 번역 기능은 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아브하즈어
에이스아체어
achAcoli
af아프리칸스어
AKAkan
alz알루르어
오전암하라어
an아라곤어
ar아랍어
as아삼어
av아바르어
awa아와디어
ay아이마라어
az아제르바이잔어
ba바슈키르어
bal발루치어
차단발리어
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바스크어
fa이란어
ff풀라어
fi핀란드어
fil필리핀어
fj피지어
fo페로어
폰어Fon
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일로카노어
is아이슬란드어
it이탈리아어
iu이누이트어
ja일본어
Jam자메이카 크레올 영어
jv자바어
ka조지아어
kac카친어
kek케치어
kg콩고어
kha카시어
ki키쿠유어
kj콰냐마어
kk카자흐어
kl그린란드어
km표준 크메르어
kn칸나다어
ko한국어
kok콘칸어
krKanuri
kri크리오어
ks카슈미르어
ktu키투바어
ku쿠르드어
kv코미어
kw콘월어
ky키르기스어
la라틴어
lb룩셈부르크어
lgGanda
li림뷔르흐어
lij리구리아어
lmo롬바르드어
ln링갈라어
lo라오어
lt리투아니아어
lu루바 카탕가어
lua루바룰루아
루오어루오어
lus미조어
lv라트비아어
mad마두라어
mai마이틸리어
mak마카사르어
mam맘어
mfe모리시엔어
mg마다가스카르어
mh마셜어
미낭카바우어
mk마케도니아어
ml말라얄람어
mn몽골어
mr마라타어
ms말레이어
mt몰타어
mwr마르와리어
my버마어
na나우루
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티그리냐어
tiv티브어
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 가격 책정을 참조하세요.