이 가이드를 따라 나만의 음성 번역기 에이전트를 만드세요!
Aliquet morbi justo auctor cursus auctor aliquam. Neque elit blandit et quis tortor vel ut lectus morbi. Amet mus nunc rhoncus sit sagittis pellentesque eleifend lobortis commodo vestibulum hendrerit proin varius lorem ultrices quam velit sed consequat duis. Lectus condimentum maecenas adipiscing massa neque erat porttitor in adipiscing aliquam auctor aliquam eu phasellus egestas lectus hendrerit sit malesuada tincidunt quisque volutpat aliquet vitae lorem odio feugiat lectus sem purus.
Viverra mi ut nulla eu mattis in purus. Habitant donec mauris id consectetur. Tempus consequat ornare dui tortor feugiat cursus. Pellentesque massa molestie phasellus enim lobortis pellentesque sit ullamcorper purus. Elementum ante nunc quam pulvinar. Volutpat nibh dolor amet vitae feugiat varius augue justo elit. Vitae amet curabitur in sagittis arcu montes tortor. In enim pulvinar pharetra sagittis fermentum. Ultricies non eu faucibus praesent tristique dolor tellus bibendum. Cursus bibendum nunc enim.
Mattis quisque amet pharetra nisl congue nulla orci. Nibh commodo maecenas adipiscing adipiscing. Blandit ut odio urna arcu quam eleifend donec neque. Augue nisl arcu malesuada interdum risus lectus sed. Pulvinar aliquam morbi arcu commodo. Accumsan elementum elit vitae pellentesque sit. Nibh elementum morbi feugiat amet aliquet. Ultrices duis lobortis mauris nibh pellentesque mattis est maecenas. Tellus pellentesque vivamus massa purus arcu sagittis. Viverra consectetur praesent luctus faucibus phasellus integer fermentum mattis donec.
Commodo velit viverra neque aliquet tincidunt feugiat. Amet proin cras pharetra mauris leo. In vitae mattis sit fermentum. Maecenas nullam egestas lorem tincidunt eleifend est felis tincidunt. Etiam dictum consectetur blandit tortor vitae. Eget integer tortor in mattis velit ante purus ante.
“Lacus donec arcu amet diam vestibulum nunc nulla malesuada velit curabitur mauris tempus nunc curabitur dignig pharetra metus consequat.”
Commodo velit viverra neque aliquet tincidunt feugiat. Amet proin cras pharetra mauris leo. In vitae mattis sit fermentum. Maecenas nullam egestas lorem tincidunt eleifend est felis tincidunt. Etiam dictum consectetur blandit tortor vitae. Eget integer tortor in mattis velit ante purus ante.
GMI Cloud의 소프트웨어 엔지니어 그레이스 덩이 (Grace Deng) 의 ODSC 웨비나를 기반으로 함
시청할 수 있습니다 원본 웨비나 녹화는 여기!
영어로 “안녕하세요”라고 말하고 그 말을 중국어로 즉시, 자연스럽게, 개성 있게 들었다고 상상해 보세요.이것이 바로 실시간 음성 번역이 할 수 있는 일이며, 이제 오픈 소스 도구와 확장 가능한 인프라를 통해 누구나 이를 구축할 수 있습니다.
최근 열린 ODSC 웨비나에서 GMI Cloud의 소프트웨어 엔지니어 그레이스 덩 (Grace Deng) 은 한 시간도 채 안 되는 시간에 음성-음성 번역기 구축 과정을 안내했습니다.이 가이드에서는 사용된 주요 단계와 오픈 소스 도구를 자세히 설명하므로 몇 분 만에 따라하고 직접 배포할 수 있습니다.
다음과 같은 기능을 갖춘 실시간 음성 번역기를 만들게 됩니다.
사용 사례:
voice_translator/
├── translator.py # Main app script
├── audio.wav # Output audio file
├── requirements.txt # Dependencies
└── README.md # Project documentation
파이썬 환경 (Conda 또는 venv) 을 만들고, requirements.txt 파일에 종속성을 추가하고, 다음을 설치합니다.
pip install -r requirements.txt
다음은 가져온 종속성 목록과 이를 원하는 이유입니다.
import gradio as gr
import os
import torch
import whisper as whisper_ai
from TTS.api import TTS
import requests
import transformers
import numpy
import librosa
이 섹션에서는 다음을 실행하기 위한 하드웨어 설정을 준비합니다. 음성-음성 번역기 두 가지 주요 작업에 GPU 장치를 할당함으로써:
최적의 성능을 위해 각 작업을 별도의 GPU (사용 가능한 경우) 에서 실행하는 것을 목표로 합니다.
✅ 팁: Whisper 및 TTS와 같은 딥 러닝 모델을 사용할 때 워크로드를 여러 GPU에 분산하면 런타임 성능이 크게 향상되고 지연 시간이 줄어들 수 있습니다.디바이스에 적합한 방식으로 워크로드를 자유롭게 분산할 수 있습니다.여기서는 마지막 GPU 두 개를 사용합니다.
num_gpus = torch.cuda.device_count()
if num_gpus >= 2:
device_whisper = f"cuda:{num_gpus - 2}"
device_tts = f"cuda:{num_gpus - 1}"
elif num_gpus == 1:
device_whisper = device_tts = "cuda:0"
else:
device_whisper = device_tts = "cpu"
print(f"Using {device_whisper} for Whisper ASR")
print(f"Using {device_tts} for Mozilla TTS")
이 섹션에서는 OpenAI를 사용하여 자동 음성 인식 (ASR) 구성 요소를 준비합니다. 위스퍼 라지 V3 허깅 페이스 트랜스포머로 구동되는 모델.
torch_dtype = torch.float32
model_id = "openai/whisper-large-v3"
transcribe_model = transformers.AutoModelForSpeechSeq2Seq.from_pretrained(
model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True, use_safetensors=True
)
transcribe_model.to(device_whisper)
processor = transformers.AutoProcessor.from_pretrained(model_id)
pipe0 = transformers.pipeline(
"automatic-speech-recognition",
model=transcribe_model,
tokenizer=processor.tokenizer,
feature_extractor=processor.feature_extractor,
max_new_tokens=128,
chunk_length_s=30,
batch_size=16,
return_timestamps=True,
torch_dtype=torch_dtype,
device=device_whisper,
)
def preprocess_audio(audio):
if audio.dtype != numpy.float32:
audio = audio.astype(numpy.float32)
sr = 16000
y = librosa.resample(audio, orig_sr=sr, target_sr=sr)
if len(y.shape) > 1:
y = librosa.to_mono(y)
return y
def transcribe_audio(audio) -> str:
sr, y = audio
y = preprocess_audio(y)
y = y.astype(numpy.float32)
y /= numpy.max(numpy.abs(y))
output_text = pipe0(y, generate_kwargs={"language": "english","temperature": 0.5, "top_p": 0.9,})["text"]
print(output_text)
return output_text
이 단계에서는 다음을 소개하여 전사와 음성 합성 간의 격차를 해소합니다. 텍스트 번역.
영어 스크립트를 중국어로 번역하기 위해 REST API (https://api.gmi-serving.com/v1/chat/completions) 를 통해 호스팅된 Llama-3 모델을 사용합니다.이 함수는 API 호출을 Python으로 래핑하고 적절한 헤더 및 페이로드가 포함된 POST 요청을 사용합니다.
응답은 JSON으로 파싱됩니다.응답이 유효하고 성공하면 (status_code == 200), 함수는 번역된 메시지를 추출하여 반환합니다.그렇지 않으면 오류를 정상적으로 처리하고 유용한 디버깅 정보를 기록합니다.
✅ 이제 영어 오디오를 변환하고 중국어로 번역하면 중국어 오디오 출력을 생성할 수 있습니다.
def translate_text(text):
url = "https://api.gmi-serving.com/v1/chat/completions"
headers = {
"Content-Type": "application/json",
"Authorization": "<GMI_API_KEY>"
}
payload = {
"model": "meta-llama/Llama-3.3-70B-Instruct",
"messages": [
{"role": "system", "content": "Translate the following English text into Chinese. Include the translation and nothing else."},
{"role": "user", "content": text}
],
"temperature": 0,
"max_tokens": 500
}
response = requests.post(url, headers=headers, json=payload, verify=False)
if response.status_code == 200:
try:
data = response.json()
translated_text = data['choices'][0]['message']['content']
except ValueError as e:
print("Failed to parse JSON:", e)
return translated_text
else:
print("Error with the request:", response.status_code, response.text)
return "No translation provided"
이 섹션에서는 번역된 텍스트에서 오디오를 생성하고 모든 구성 요소를 단일 함수로 연결하여 음성-음성 번역 파이프라인을 완성합니다.
Coqui TTS의 다국어 TTS 모델 xtts_v2가 로드되어 지정된 TTS 장치 (device_tts) 로 이동되므로 가능한 경우 GPU를 사용하여 빠르게 추론할 수 있습니다.
번역된 텍스트를 받아 음성 오디오 파일을 생성하는 text_to_speech 함수를 정의합니다.
tts_model = TTS("tts_models/multilingual/multi-dataset/xtts_v2")
tts_model.to(device_tts)
def text_to_speech(text):
output_path = "audio.wav"
tts_model.tts_to_file(text=text, file_path=output_path, speaker="Ana Florence", language="zh-cn")
return output_path
🔄 엔드-투-엔드 음성 번역 파이프라인
voice_to_voice () 함수는 모든 단계를 통합합니다.
마지막으로 생성된 오디오 파일의 경로를 반환합니다.
✅ 이제 완전히 작동하는 음성-음성 번역기가 있습니다. 영어 오디오 입력 → 중국어 오디오 출력!
def voice_to_voice(audio):
if audio is None:
return gr.Audio(value=None)
output_audio = text_to_speech(translate_text(transcribe_audio(audio)))
return output_audio
이 마지막 단계에서는 다음을 사용하여 음성-음성 번역 파이프라인을 사용자 친화적인 인터페이스로 마무리합니다. 그라디오.
다음을 처리하기 위해 gr.Interface 인스턴스를 만듭니다.
마지막으로 share=True를 사용하여.launch () 를 호출하여 다음을 수행합니다.
# --- Gradio UI ---
demo = gr.Interface(
fn=voice_to_voice,
inputs=gr.Audio(sources="microphone"),
outputs=gr.Audio(sources=["microphone"]),
title="Voice-to-Voice Translator",
description="🎤 Speak in English → 📝 Get Chinese text → 🔊 Listen to Chinese speech.",
live=True
)
demo.launch(share=True)
GMI Cloud는 AI 프로젝트를 빠르게 시작할 수 있도록 도와드립니다.GPU를 지원하는 API와 호스팅된 엔드포인트를 사용하면 실험을 위해 인프라를 고민할 필요가 없습니다.
가입하기 GMI 디스코드 커뮤니티 다른 빌더와 소통하고 창작물을 공유할 수 있습니다.
GMI Cloud를 사용해 보고 AI 요구 사항에 적합한지 직접 확인해 보세요.
에서 시작
GPU 시간당 4.39달러
최저
GPU-시간당 2.50달러