Qwen3 TTS는 저평가됨 - 로컬에서 실시간으로 돌려봤는데 지금까지 써본 오픈 TTS 중 가장 표현력이 뛰어남
핵심 요약
Qwen3 TTS를 활용해 실시간 립싱크가 가능한 로컬 페르소나 엔진을 구현하고 성능을 최적화한 사례.
- 실시간 스트리밍 구현 — 슬라이딩 윈도우 디코더를 활용해 일관된 억양과 피치를 유지하며 스트리밍 성능 확보.
- 로컬 최적화 — llama.cpp와 연동하여 C# 환경에서 효율적으로 구동되도록 모델을 양자화함.
- 립싱크 정밀도 — CTC 기반 단어 단위 정렬을 구현하여 입 모양과 음성이 정확히 일치하도록 개선.
- 음성 파인튜닝 — 기존 모델의 부족한 감정 표현과 발음을 보완하기 위해 자체 데이터셋으로 음성 모델을 직접 학습.
여러분 안녕하세요,
약 1년 전, 저는 재미 삼아 Persona Engine이라는 사이드 프로젝트를 공개하고 글을 올린 적이 있습니다. ASR -> LLM -> TTS 파이프라인을 완전히 로컬에서 구동하면서 실시간으로 립싱크가 되는 아바타(VTuber 같은 것)를 만드는 것이 목표였죠. 결과물은 꽤 만족스러웠지만, 당시 참고용으로 사용하던 Sesame 모델 때문에 TTS 성능이 확실히 아쉬웠습니다. 그 후로 한동안 쉬었죠.
일주일이나 2주 전쯤, 프로젝트를 새로 단장해보고 싶었고 로컬 모델들이 얼마나 발전했는지 궁금했는데, Qwen3 TTS를 보고 정말 깜짝 놀랐습니다. 초기 테스트 때는 특히 Qwen 팀이 직접 공개한 버전이 많이 부족했지만, 이것저것 파고들며 실험한 끝에 다음을 구현할 수 있었습니다.
- 모델 스트리밍을 안정적으로 작동하게 만들었습니다. 모델 구조가 스트리밍에 완벽한데, 디코더가 슬라이딩 윈도우를 사용하기 때문에 LLM 응답을 스트리밍해도 TTS가 일관된 억양, 피치, 인토네이션을 유지할 수 있습니다.
- llama.cpp와 연동했습니다. C#을 사용 중이라 속도가 중요해서 모델을 양자화하기도 했습니다.
- 기존 모델에는 Kokoro(이전의 기계음 같은 TTS)에 있던 단어 단위 타이밍과 음소 정보가 부족했습니다. 그래서 특정 단어가 언제 발음되는지 알 수 있도록 CTC 단어 단위 정렬을 직접 구현해야 했습니다(자막 생성 및 입 모양을 정확히 움직이기 위한 음소 추출에 필수적입니다).
이 모든 작업을 마친 후, 저만의 Qwen3-TTS 음성을 파인튜닝하기로 했습니다. 클로닝 기능은 정말 멋지지만 문맥 이해도가 부족하고 발음이 뭉개지는 문제가 있었습니다. 게다가 Qwen 팀이 제공한 커스텀 음성에는 여성 원어민이 없었고, 새로운 Live2D 모델을 만들고 싶지도 않았거든요.
결과적으로 파인튜닝 결과는 기대 이상이었고, 앞으로도 계속 개선해 나갈 생각입니다.
GitHub 주소는 여기입니다: https://github.com/fagenorn/handcrafted-persona-engine
한번 확인해보시고, 재미있게 즐겨주세요. 이걸로 어떤 미친 짓을 하실지 알려주시면 감사하겠습니다.



