홈으로 돌아가기

Repka-Pi에서의 TTS: eSpeak NG와 Piper

이 기사는 Repka-Pi 4에서 eSpeak NG와 Piper TTS를 사용한 TTS 구현을 설명합니다. 설치 지침, CLI/Python 통합, 큐가 있는 FastAPI 서버가 제공됩니다. IoT 및 음성 어시스턴트에 적합합니다.

Repka-Pi 4에서의 Piper TTS 음성 합성
Advertisement 728x90

마이크로컴퓨터에서 음성 합성: eSpeak NG부터 Piper TTS까지

음성 합성은 기계 장치에서 신경망 모델로 발전해왔다. 18세기 말, 다이아프램과 벨로우스를 사용한 기계적 음역 시뮬레이션 장치가 목소리 톤을 모방했으며, 1846년에 등장한 유포니아는 키와 음향 부품을 통해 이를 구현했다.

전자 시대는 벨랩의 보더(1930년)에서 시작됐다. 톤 생성기, 노이즈 소스, 필터를 키보드로 조작하는 방식이었다. 패턴 플레이백(1940~1950년대)은 스펙트로그램을 재생했다. 1961년 IBM 704는 음역을 모델링해 '데이지 벨'을 노래했다. 일본에서는 1968년 최초의 형성자 기반 음성합성 시스템이 등장했고, 1975~1978년 MUSA는 실시간 이탈리아어 음성을 제공했다.

1980년대: 음소 기반 형성 합성. 1990년대: 통계적 방법. 2010년대: VITS 같은 엔드투엔드 신경망.

Google AdInline article slot

가벼운 eSpeak NG 음성합성

eSpeak NG는 실제 음성 샘플 없이 형성자 기반으로 동작하는 오픈소스 음성합성 시스템이다. 출력은 로봇처럼 들리지만 자원 소모가 극히 적어, 2GB RAM의 Repka-Pi 4에도 완벽하게 작동한다. 경고음이나 프로토타입 개발에 최적이다.

설치 및 CLI 사용법

패키지 업데이트 후 설치:

apt update
apt install espeak-ng

사용 가능한 음성 확인:

Google AdInline article slot
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

파일에서 여성 음성으로 실행:

Google AdInline article slot
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

Advertisement 728x90

다음 읽기