마이크로컴퓨터에서 음성 합성: eSpeak NG부터 Piper TTS까지
음성 합성은 기계 장치에서 신경망 모델로 발전해왔다. 18세기 말, 다이아프램과 벨로우스를 사용한 기계적 음역 시뮬레이션 장치가 목소리 톤을 모방했으며, 1846년에 등장한 유포니아는 키와 음향 부품을 통해 이를 구현했다.
전자 시대는 벨랩의 보더(1930년)에서 시작됐다. 톤 생성기, 노이즈 소스, 필터를 키보드로 조작하는 방식이었다. 패턴 플레이백(1940~1950년대)은 스펙트로그램을 재생했다. 1961년 IBM 704는 음역을 모델링해 '데이지 벨'을 노래했다. 일본에서는 1968년 최초의 형성자 기반 음성합성 시스템이 등장했고, 1975~1978년 MUSA는 실시간 이탈리아어 음성을 제공했다.
1980년대: 음소 기반 형성 합성. 1990년대: 통계적 방법. 2010년대: VITS 같은 엔드투엔드 신경망.
가벼운 eSpeak NG 음성합성
eSpeak NG는 실제 음성 샘플 없이 형성자 기반으로 동작하는 오픈소스 음성합성 시스템이다. 출력은 로봇처럼 들리지만 자원 소모가 극히 적어, 2GB RAM의 Repka-Pi 4에도 완벽하게 작동한다. 경고음이나 프로토타입 개발에 최적이다.
설치 및 CLI 사용법
패키지 업데이트 후 설치:
apt update
apt install espeak-ng
사용 가능한 음성 확인:
espeak-ng --voices | grep Russian
텍스트 합성:
espeak-ng "Hello Repka Pi" -v ru
여러 줄 텍스트는 heredoc 방식으로:
espeak-ng -v ru -s 150 << EOF
Hello world!
This very long text,
that takes several lines.
EOF
파일에서 여성 음성으로 실행:
espeak-ng -v ru+f5 -s 150 -f hello-repka-pi.txt
음성 목록: ru, ru+m1..m7, ru+f1..f5.
파이썬과 연동
서브프로세스 실행 함수:
import subprocess
def say(text, voice="ru", speed=150, pitch=50):
"""
voice — 언어/음성 (ru, en, de).
speed — 80–200.
pitch — 0–99.
"""
try:
subprocess.run([
"espeak-ng",
"-v", voice,
"-s", str(speed),
"-p", str(pitch),
text
], check=True, capture_output=True)
except FileNotFoundError:
print("espeak-ng not found. Install: sudo apt install espeak-ng")
except subprocess.CalledProcessError as e:
print("Error:", e.stderr.decode())
if __name__ == "__main__":
say("Hello! This test of a Russian voice.", voice="ru", speed=140)
say("Hello, this is a test in English", voice="en-us", speed=160, pitch=60)
say("Testing another Russian voice", voice="ru+f3", speed=135)
실행 명령: python3 espeak-ng-test.py.
신경망 기반 Piper TTS
Piper TTS는 VITS(Variational Inference with adversarial learning for end-to-end TTS)와 ONNX 모델을 활용해 마이크로컴퓨터에서도 자연스럽고 실시간 음성을 제공한다. Repka-Pi 4에서도 뛰어난 성능과 수용 가능한 지연 시간을 보인다.
설치 및 모델 설정
가상 환경 구성:
sudo apt update
sudo apt install python3-pip
python3 -m venv ~/piper_env
source ~/piper_env/bin/activate
pip install --upgrade pip
pip install piper-tts sounddevice numpy
러시아어 모델(데니스 미디엄) 다운로드:
mkdir -p ~/piper-voices/ru
cd ~/piper-voices/ru
wget https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/ru/ru_RU/denis/medium/ru_RU-denis-medium.onnx?download=true -O ru_RU-denis-medium.onnx
wget https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/ru/ru_RU/denis/medium/ru_RU-denis-medium.onnx.json?download=true -O ru_RU-denis-medium.onnx.json
CLI 및 파이썬 실행
WAV 파일로 합성:
piper --model ~/piper-voices/ru/ru_RU-irina-medium.onnx --output_file 큰_텍스트.wav <<EOF
안녕 세상!
이건 아주 긴 텍스트...
EOF
aplay 큰_텍스트.wav
파일에서 실행: piper --model model.onnx --output_file output.wav -f input.txt.
파이썬 연동은 eSpeak NG와 유사하며, 서브프로세스나 네이티브 API를 통해 piper 사용 가능.
FastAPI 음성합성 서버
요청 큐를 관리하는 비동기 서버를 구축해 Repka-Pi 4에서 systemd 서비스로 실행할 수 있다.
- 장점: 클라이언트는 대기 없이 HTTP POST 요청 전송; 서버는 작업을 큐에 저장.
- 스택: FastAPI, Piper TTS, 작업 큐.
서버 코드 예시:
from fastapi import FastAPI
import queue
import threading
from piper import PiperVoice
app = FastAPI()
voice = PiperVoice.load("~/piper-voices/ru/ru_RU-denis-medium.onnx")
task_queue = queue.Queue()
def process_queue():
while True:
text = task_queue.get()
wav = voice.synthesize(text)
# 저장 또는 스트리밍
task_queue.task_done()
threading.Thread(target=process_queue, daemon=True).start()
@app.post("/synthesize")
async def synthesize(text: str):
task_queue.put(text)
return {"status": "queued"}
systemd 유닛 파일:
[Unit]
Description=Piper TTS Server
After=network.target
[Service]
ExecStart=/path/to/server.py
Restart=always
[Install]
WantedBy=multi-user.target
클라이언트: curl -X POST http://repka-pi:8000/synthesize -d '합성할 텍스트'.
핵심 요약
- eSpeak NG: 낮은 리소스 사용, 형성자 기반, 저사양 하드웨어에 최적.
- Piper TTS: VITS/ONNX 기반 자연스러운 음성, SBC에서 실시간 처리 가능.
- FastAPI 서버: 비동기 큐, systemd 자동 시작.
- 활용 사례: 음성 보조기, IoT 기기, Repka-Pi 4/5 기반 로봇.
- Repka-Pi 5: 최대 32GB RAM, TTS+ASR 작업에서 라즈베리파이 5보다 두 배 이상 성능 향상.
— Editorial Team
아직 댓글이 없습니다.