tts
-
LLM 토큰을 듣자마자 TTS에 넣기 — 문장 경계 큐잉으로 첫 음성 지연 압축IT 2026. 5. 12. 23:00
음성 챗봇의 첫 인상은 "질문을 끝낸 뒤 첫 음성이 들리기까지 몇 초 걸리느냐"로 결정됩니다. 5초가 넘으면 아이가 화면을 보며 "이거 고장 났어?"라고 물어봅니다. 3초 이하면 자연스러운 대화처럼 느낍니다.그래서 LLM 응답이 끝나기를 기다리지 않고, 토큰이 흐르는 동안 문장 단위로 TTS를 시작하는 패턴을 적용했습니다. 한국어 답변이 5문장이라면 첫 문장이 완성되는 1~2초쯤에 TTS 합성을 시작하고, 사용자는 LLM이 나머지 4문장을 만드는 동안 첫 문장을 듣고 있습니다. 첫 음성까지의 지연이 절반 이하로 줄어듭니다.기본 흐름과 단순한 접근의 한계LLM은 SSE(Server-Sent Events) 같은 스트리밍 채널로 토큰을 한 글자씩 흘려보냅니다. 그걸 받은 클라이언트가 화면에 그대로 찍으면 Ch..
-
GB짜리 TTS 모델을 가정용 서버에서 굴리는 법 — on-demand 데몬과 idle watchdogIT 2026. 5. 12. 21:00
아들 음성 챗봇은 답을 음성으로 들려줘야 합니다. 그래서 한국어 TTS(Text-to-Speech) 엔진이 필요한데, 처음 골라본 후보 중 가장 자연스러웠던 것이 Coqui의 XTTSv2였습니다. 다국어를 한 모델로 다루고 한국어도 꽤 자연스럽고 무엇보다 무료입니다.그런데 모델 크기가 1.8GB쯤 됩니다. GPU에 올리면 메모리 2GB 정도를 점유합니다. 가정용 서버 하나에서 STT(Whisper)·LLM(Qwen3.6)·VLM·임베딩 같은 다른 작업까지 돌리는 환경에선 이 메모리가 만만치 않습니다. 한 번 로드해두고 24시간 띄워두기엔 비용이 크고, 매번 처음부터 로드하기엔 첫 응답이 너무 늦습니다(콜드 스타트 5~7초).그래서 on-demand 데몬 패턴을 골랐습니다. 첫 요청에 깨어나고, 한 시간 ..
-
로컬 챗봇 시리즈 #5 — 다른 프로젝트의 venv를 subprocess로 빌려쓰기: 의존성 추가를 거부하는 영리함IT 2026. 5. 8. 23:00
들어가며 — "마이크 버튼 하나만 더해주세요"의 진짜 비용손에 음식 묻었을 때, 또는 한 손은 아이를 안고 있을 때 — 키보드를 못 친다. ChatGPT 모바일이 마이크 버튼 하나로 음성을 받기 시작한 순간 사용자가 "그래, 이거지" 한다. 로컬 챗봇에도 같은 게 필요했다.음성 입출력은 두 단계 — 마이크 → 텍스트(STT, Speech-To-Text)와 텍스트 → 스피커(TTS, Text-To-Speech). STT는 Whisper, TTS는 Piper 같은 표준이 있다. 그런데 막상 챗봇 코드베이스에 "pip install faster-whisper 한 줄만 더하자"라는 결정이 의외로 비싸다. 이번 글은 그 의존성 추가를 거부하고 이미 있는 다른 프로젝트의 venv를 subprocess로 빌려쓴 영리..