오픈 소스 AI로 실시간 음성 번역기를 구축하는 방법
GMI Cloud의 소프트웨어 엔지니어 그레이스 덩이 (Grace Deng) 의 ODSC 웨비나를 기반으로 함
시청할 수 있습니다 원본 웨비나 녹화는 여기!
소개
영어로 “안녕하세요”라고 말하고 그 말을 중국어로 즉시, 자연스럽게, 개성 있게 들었다고 상상해 보세요.이것이 바로 실시간 음성 번역이 할 수 있는 일이며, 이제 오픈 소스 도구와 확장 가능한 인프라를 통해 누구나 이를 구축할 수 있습니다.
최근 열린 ODSC 웨비나에서 GMI Cloud의 소프트웨어 엔지니어 그레이스 덩 (Grace Deng) 은 한 시간도 채 안 되는 시간에 음성-음성 번역기 구축 과정을 안내했습니다.이 가이드에서는 사용된 주요 단계와 오픈 소스 도구를 자세히 설명하므로 몇 분 만에 따라하고 직접 배포할 수 있습니다.
무엇을 만들 것인가
다음과 같은 기능을 갖춘 실시간 음성 번역기를 만들게 됩니다.
- 🎤 마이크를 통한 실시간 음성 입력
- 📝 위스퍼를 이용한 자동 영어 음성 녹음
- 🌐 LaMa 3를 사용하여 영어 텍스트를 중국어로 번역
- 🔊 XTTS를 사용한 중국어 텍스트 음성 변환 생성
- 🚀 브라우저 기반 상호 작용을 위해 Gradio와 함께 배포
사용 사례:
- 여행 도우미
- 접근성 지원
- 실시간 회의 번역
사용할 도구
코어 AI 모델
- 위스퍼 (ASR): 음성을 텍스트로 변환
- 라마-3 (LM): 영어에서 중국어로 텍스트 번역
- 코키 XTTS v2 (TTS): 다국어 출력을 지원하는 음성 합성
서포트 스택
- 트랜스포머: ASR 및 LLM을 위한 허깅페이스 파이프라인
- 쿠다: ASR/TTS 가속을 위한 멀티 GPU 지원
- 그라디오: 실시간 브라우저 상호 작용을 위한 빠른 UI
- GMI 클라우드 API: 대규모 모델 추론을 위한 호스팅된 엔드포인트
단계별 가이드
📁 프로젝트 구조
voice_translator/
├── translator.py # Main app script
├── audio.wav # Output audio file
├── requirements.txt # Dependencies
└── README.md # Project documentation1.환경 설정하기
파이썬 환경 (Conda 또는 venv) 을 만들고, requirements.txt 파일에 종속성을 추가하고, 다음을 설치합니다.
pip install -r requirements.txt2.종속성 가져오기
다음은 가져온 종속성 목록과 이를 원하는 이유입니다.
- gradio: 웹 기반 사용자 인터페이스를 구축하기 위한 것입니다.
- os: 파일 시스템과의 상호 작용에 사용됩니다.
- 토치: ML 모델을 실행하기 위한 핵심 파이토치 라이브러리입니다.
- 귓속말: 음성을 텍스트로 변환하기 위한 OpenAI의 ASR 모델.
- TTS.api.tts: 텍스트를 음성으로 변환하는 데 사용되는 Coqui-AI/TTS 라이브러리의 TTS 엔진입니다.
- 요청: HTTP 요청 (예: 리소스 다운로드) 에 사용됩니다.
- 트랜스포머: 사전 학습된 모델을 사용하기 위한 HuggingFace 라이브러리 (예: 번역용).
- numpy: 범용 수치 컴퓨팅.
- librosa: 오디오 처리 및 특징 추출.
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 3.GPU 디바이스 준비하기
이 섹션에서는 다음을 실행하기 위한 하드웨어 설정을 준비합니다. 음성-음성 번역기 두 가지 주요 작업에 GPU 장치를 할당함으로써:
- 위스퍼 ASR (자동 음성 인식) — 음성 언어를 텍스트로 변환
- 텍스트를 음성으로 변환 (TTS) — 번역된 텍스트를 음성 오디오로 다시 합성합니다.
최적의 성능을 위해 각 작업을 별도의 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")4.위스퍼 ASR: 음성을 텍스트로
이 섹션에서는 OpenAI를 사용하여 자동 음성 인식 (ASR) 구성 요소를 준비합니다. 위스퍼 라지 V3 허깅 페이스 트랜스포머로 구동되는 모델.
- 🔁 파이프라인: Whisper ASR 모델 및 프로세서는 파이프라인에 포함되어 있어 오디오를 청크 단위로 처리 (일괄 처리당 최대 30초) 하여 보다 효율적으로 처리할 수 있습니다.
- 🎧 오디오 전처리: 오디오를 ASR 모델에 공급하기 전에 오디오가 올바른 형식인지 확인해야 합니다.다음 함수는 오디오를 16kHz로 리샘플링하고 (아직 그렇지 않은 경우), 스테레오인 경우 모노로 변환하고, 처리에 적합한 데이터 유형인지 확인합니다.
- 📝 오디오 스크립트 작성: 이 함수는 오디오를 입력으로 받아 전처리한 다음 Whisper ASR 파이프라인을 통해 전달하여 트랜스크립션을 생성합니다.오디오는 먼저 리샘플링 및 변환된 후 정규화되고 마지막으로 트랜스크립션을 위해 모델로 전송됩니다.
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_text5.라마-3으로 번역하기
이 단계에서는 다음을 소개하여 전사와 음성 합성 간의 격차를 해소합니다. 텍스트 번역.
🔁 Llama-3 API를 사용하여 텍스트 번역하기
영어 스크립트를 중국어로 번역하기 위해 REST API (https://api.gmi-serving.com/v1/chat/completions) 를 통해 호스팅된 Llama-3 모델을 사용합니다.이 함수는 API 호출을 Python으로 래핑하고 적절한 헤더 및 페이로드가 포함된 POST 요청을 사용합니다.
- 인증 헤더에는 베어러 토큰 (API 키) 이 포함됩니다.
- 요청 페이로드는 다음을 지정합니다.
- 모델명 (메타라마/라마-3.3-70B-인스트럭트)
- 모델이 영어에서 중국어로 번역을 수행하고 번역만 반환하도록 지시하는 시스템 메시지입니다.
- 입력 텍스트가 포함된 사용자 메시지입니다.
- 결정적 출력의 경우 온도 (0), 토큰 제한은 500입니다.
응답은 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"
6.코키 XTTS: 텍스트 투 스피치
이 섹션에서는 번역된 텍스트에서 오디오를 생성하고 모든 구성 요소를 단일 함수로 연결하여 음성-음성 번역 파이프라인을 완성합니다.
🔁 TTS 모델 불러오기
Coqui TTS의 다국어 TTS 모델 xtts_v2가 로드되어 지정된 TTS 장치 (device_tts) 로 이동되므로 가능한 경우 GPU를 사용하여 빠르게 추론할 수 있습니다.
🎙️ 번역된 텍스트를 음성으로 변환
번역된 텍스트를 받아 음성 오디오 파일을 생성하는 text_to_speech 함수를 정의합니다.
- 출력 오디오는 "audio.wav “로 저장됩니다.
- 이 함수는 사전 정의된 스피커 음성 “Ana Florence”를 사용하며 출력 언어는 “zh-cn" (중국어) 으로 설정됩니다.
- Coqui TTS의 tts_to_file () 은 합성을 처리하고 오디오를 디스크에 씁니다.
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
7.모두 정리하세요
🔄 엔드-투-엔드 음성 번역 파이프라인
voice_to_voice () 함수는 모든 단계를 통합합니다.
- 입력: 원시 오디오 클립 (사용자 음성) 을 수신합니다.
- 확인: 오디오가 제공되지 않은 경우 None을 반환합니다.
- 스크립트 작성: Whisper를 사용하여 오디오를 영어 텍스트로 변환합니다.
- 번역: LlaMa를 사용하여 영어 텍스트를 중국어로 번역합니다.
- 합성: 번역된 텍스트에서 중국어 음성 오디오 클립을 생성합니다.
마지막으로 생성된 오디오 파일의 경로를 반환합니다.
✅ 이제 완전히 작동하는 음성-음성 번역기가 있습니다. 영어 오디오 입력 → 중국어 오디오 출력!
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
8.그라디오와 함께 시작하세요
이 마지막 단계에서는 다음을 사용하여 음성-음성 번역 파이프라인을 사용자 친화적인 인터페이스로 마무리합니다. 그라디오.
🛠️ 그라디오 인터페이스 정의하기
다음을 처리하기 위해 gr.Interface 인스턴스를 만듭니다.
- 입력: 사용자 마이크의 실시간 오디오 (gr.Audio (소스="마이크”)).
- 출력: 중국어로 오디오가 생성되고 재생을 위해 마이크 스타일의 오디오 위젯으로도 렌더링됩니다.
- 기능: 앞서 정의한 voice_to_voice () 함수가 핵심 처리 파이프라인으로 사용됩니다.
- 메타데이터:
- 타이틀: “음성-음성 번역기”
- 설명: 시스템 동작에 대한 단계별 요약을 제공합니다.
- 라이브 모드: 실시간 오디오 스트리밍을 지원하도록 활성화되었습니다 (Live=True).
🚀 앱 실행
마지막으로 share=True를 사용하여.launch () 를 호출하여 다음을 수행합니다.
- 앱의 로컬 서버를 시작합니다.
- 공개 URL을 생성하여 온라인에서 다른 사람들과 데모를 공유하여 음성-음성 번역기를 테스트하거나 선보일 수 있습니다.
# --- 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)
그레이스의 프로 팁
- 지연 시간을 줄이기 위해 별도의 GPU에서 ASR 및 TTS를 실행합니다.
- 깨끗한 16kHz 오디오 입력을 사용하여 위스퍼 정확도를 개선하세요.
- 번역 정확도를 위한 온도 및 프롬프트 조정
- 맞춤형 스피커 또는 접근성 튜닝에 Coqui 음성 복제 사용
리소스
제한 없는 AI 구축
GMI Cloud는 AI 프로젝트를 빠르게 시작할 수 있도록 도와드립니다.GPU를 지원하는 API와 호스팅된 엔드포인트를 사용하면 실험을 위해 인프라를 고민할 필요가 없습니다.
가입하기 GMI 디스코드 커뮤니티 다른 빌더와 소통하고 창작물을 공유할 수 있습니다.
.png)

