개발 기록 2026-10-31 오전: 사진 드라마용 무료 TTS 탐색, Qwen3-TTS GGUF 로드 에러, 기술 아티클 5편 발행

· 약 6분 읽기 · 조회 2 #개발기록#TTS#Qwen3-TTS#LM Studio#블로그#Claude Code

이 기간에는 두 가지를 했다. 저녁에는 사진 드라마에 쓸 음성 파일을 무료로 만들 방법을 찾았고, 다음 날 오전에는 블로그에 기술 아티클 5편을 올렸다. 작업은 모두 Claude Code로 진행했다.

CosyVoice를 LM Studio에 설치하려다 방향을 바꿈

처음 목표는 CosyVoice를 LM Studio에 설치해서 음성 파일을 만드는 것이었다. Claude Code는 이 방법이 안 된다고 답했다. LM Studio는 텍스트 LLM(GGUF/MLX)만 실행하고 음성 출력(TTS) 모델은 지원하지 않는다. CosyVoice는 PyTorch 기반 TTS라서 LM Studio에 넣을 수 없다.

대안으로 Mac에 CosyVoice를 직접 설치하는 계획이 나왔다. 장비는 Apple Silicon에 RAM 128GB라 사양 문제는 없었다. 계획은 다음과 같았다.

  1. brew install sox git-lfs
  2. 공식 repo FunAudioLLM/CosyVoice를 git clone --recursive로 받기
  3. Python 3.10 conda 환경 만들기. 시스템 Python 3.15는 PyTorch가 지원하지 않기 때문이다.
  4. pynini는 conda-forge로 받고 나머지 패키지는 requirements.txt로 설치하기
  5. Fun-CosyVoice3-0.5B 모델 받기. 한국어를 지원하고 크기는 약 5GB다.

설치 단계가 많고 시간이 걸릴 것 같아서 이 계획은 진행하지 않았다.

드라마용 무료 TTS 후보 찾기

필요한 조건은 남자 목소리, 여자 목소리, 감정이 섞인 연기였다. Typecast는 품질이 좋지만 유료다. 그래서 그 정도 수준의 무료 오픈소스 모델을 추천받았다.

Claude Code는 먼저 한계를 밝혔다. 한국어 감정 연기가 Typecast만큼 된다고 검증된 오픈소스 모델은 찾지 못했고, 한국어 감정 TTS를 비교한 벤치마크도 없다. 대신 조건에 맞는 후보를 추렸다.

  • Qwen3-TTS (1순위)
    • 한국어를 포함해 10개 언어를 지원한다. 기본 한국어 여성 목소리 Sohee가 있다.
    • "울먹이며 낮게"처럼 문장으로 감정을 지시할 수 있다.
    • mlx-audio로 Apple Silicon에서 실행된다. 목소리 설명만으로 새 목소리를 만들거나 짧은 녹음으로 목소리를 복제할 수도 있다.
    • 약점: 한국어 감정 지시 품질은 확인된 자료가 없어서 직접 들어봐야 한다.
  • Chatterbox Multilingual (Resemble AI)
    • 한국어를 포함해 23개 언어를 지원한다. MIT 라이선스다.
    • exaggeration 값으로 감정 세기를 조절한다.

Qwen3-TTS GGUF 파일과 로드 에러

Hugging Face의 Serveurperso/Qwen3-TTS-GGUF를 쓰면 되는지 물었다. 답은 "쓸 수는 있지만 조건이 있다"였다.

  • 이 GGUF는 LM Studio용이 아니다. 직접 빌드해야 하는 별도 C++ 프로그램 qwentts.cpp 전용이다. Mac GPU(Metal)를 지원한다.
  • 파일 2개를 같이 받아야 한다. 하나는 talker 파일(qwen-talker-...)이고, 다른 하나는 공용 tokenizer 파일(qwen-tokenizer-12hz-...)이다.
  • 라이선스는 Apache-2.0이고 한국어(ko)를 지원한다.
  • RAM이 128GB라 README 권장값인 Q8_0이면 충분하다. 목소리와 감정을 문장으로 설명해서 만들려면 qwen-talker-1.7b-voicedesign-Q8_0.gguf(2.0GB)를 받으면 된다.

이 설명을 듣기 전에 LM Studio에서 파일을 열어 봤고, 아래 에러가 났다.

error loading model: key general.file_type has wrong type str but expected type u32

원인은 파일 손상이 아니었다. LM Studio 내부 엔진(llama.cpp)은 general.file_type을 숫자로 읽는다. 그런데 이 GGUF에는 그 값이 "Q8_0" 같은 문자열로 들어 있다. qwentts.cpp 전용 형식이라서 생기는 차이다. 이 값을 고쳐도 소용없다. LM Studio에는 음성 출력 기능이 없어서 다음 단계에서 다시 막힌다.

받아 둔 폴더에는 qwen-tokenizer-12hz-Q8_0.gguf 하나만 있었다. 실제로 음성을 만드는 talker 파일은 아직 받지 않은 상태였다.

정리된 다음 단계는 이렇다.

  1. brew install cmake
  2. git clone --recurse-submodules https://github.com/ServeurpersoCom/qwentts.cpp
  3. Metal용으로 빌드
  4. talker 파일까지 받아서 qwentts.cpp로 실행

블로그 기술 아티클 5편 발행

/blog-tech-article 명령으로 다섯 가지 주제를 한 번에 요청했다.

  1. Spring Security에서 IDOR·BOLA 취약점 방어하기
  2. Zero Trust 관점의 관리자 시스템 접근 통제 설계
  3. 공공 SI 환경의 CI/CD 배포·백업·롤백 자동화
  4. TLS 종료 지점과 Reverse Proxy 신뢰 경계 설계
  5. 감리 대응을 위한 아키텍처 증적 자동 수집 시스템

삽화 5장은 백그라운드에서 먼저 만들었다. 다섯 편 모두 바로 공개 상태로 발행했다. 공개 확인 스크립트로 검사한 결과, 다섯 편 모두 페이지 응답 200, /articles 목록 노출, 이미지 2/2를 통과했다.

다이어그램은 글마다 형태가 다르다. IDOR·BOLA 글은 흐름도다. 인증 → 사용자 범위로 조회 → 객체가 없거나 남의 것이면 404 → 해도 되는 행위가 아니면 403 순서로 그렸다. Zero Trust 글은 구성도다. IdP·MFA → 접근 프록시 → 관리자 시스템 경로를 그렸고, 단말에서 관리자 시스템으로 바로 가는 경로는 ×로 막았다.

이미지는 커밋 chore: 기술 아티클 5편(IDOR·BOLA, Zero Trust 관리자 접근, 공공 SI CI/CD, TLS 신뢰 경계, 감리 증적) 이미지 추가로 반영했다.

블로그 메뉴의 "전체글" 위치 수정 요청

메뉴에서 "전체글"이 가운데에 있어서 헷갈렸다. 그래서 빼거나 맨 위로 올려 달라고 요청했다. 이 요청을 어떻게 처리했는지는 기록에 없다.

남은 것

  • qwentts.cpp 빌드와 talker 파일 다운로드를 아직 하지 않았다. 실제 음성 생성까지 가지 못했다.
  • Qwen3-TTS의 한국어 감정 연기 품질과 Mac에서의 속도는 직접 확인하지 않았다.
  • 블로그 메뉴 "전체글" 위치 수정 결과를 확인해야 한다.

댓글 0개

아직 댓글이 없습니다. 첫 댓글을 남겨보세요.

댓글 쓰기

← 목록으로 돌아가기