speech.cpp: C++ 기반의 음성 합성, 음성 인식 및 VAD 구현
요약
speech.cpp는 C++와 ggml을 사용하여 음성 합성, 음성 인식, VAD 기능을 구현한 도구입니다. 이 도구는 단일 C API를 통해 CPU, Metal, Vulkan 등 다양한 환경에서 작동하며, 실시간 전사 및 오디오 API 연동까지 지원합니다.
핵심 포인트
- C++와 ggml 기반으로 개발되어 범용성이 높습니다.
- 음성 합성(TTS), 음성 인식(ASR), VAD 기능을 통합 제공합니다.
- CPU, Metal, Vulkan 등 다양한 플랫폼을 단일 C API로 지원합니다.
- 실시간 마이크 입력 전사 및 OpenAI 오디오 API 연동이 가능합니다.
speech.cpp는 하나의 명령어인 speech와 하나의 공유 라이브러리인 libspeech로 구성되어 있으며, ggml을 통해 CPU, Metal 및 Vulkan에서 단일 C API를 제공합니다. 이 명령어는 텍스트를 음성으로 합성하고(speaks text), 녹음된 텍스트를 기록하며(writes the text of recordings), 음성 구간을 찾아내고(finds where someone speaks in them), 사람이 말하는 동안 마이크 입력을 전사하며(speech asr --live), OpenAI의 오디오 API와 실시간 전사 결과를 HTTP를 통해 제공하고, 요청 사이에 모델을 로드 상태로 유지하는 모든 프로그램(예: ASIST)을 위한 워커 프로세스를 실행합니다.
0.25초 이하의 첫 오디오 출력 시간. Apple M5에서 Qwen3-TTS 0.6B는 텍스트가 입력된 후 0.035초 만에 첫 오디오를 전송하고, Irodori-TTS v4.1-Small-MF는 0.22초 후에 전송하며, 나머지는 재생되는 동안 이어집니다.
설치할 것이 없는 단일 실행 파일. Python이나 CUDA가 필요 없습니다: speech는 이름으로 각 모델을 가져와 해당 코덱이 포함된 GGUF 파일을 Metal, Vulkan 또는 CPU에서 실행합니다.
자신의 컴퓨터에서 사용하는 OpenAI API. speech serve는 OpenAI의 오디오 API 및 실시간 전사 결과를 처리하므로, OpenAI 클라이언트는 기본 URL만 변경하여 작동할 수 있습니다.
공식 구현체와 비교 검증됨. 모든 모델의 모든 단계가 동일한 입력을 사용하여 해당 모델의 공식 구현체와 비교됩니다.
<p align="center"> <img src="https://raw.githubusercontent.com/nyosegawa/speech.cpp/HEAD/docs/images/page-speak.png" alt="Qwen3-TTS 0.6B로 합성된 문장, 파형 및 첫 오디오까지 걸린 시간을 보여주는 speech serve 페이지" width="720"> <br> <sub><code>speech serve --open</code> 페이지: 카탈로그에서 모델을 선택하고 가져와 테스트해 보세요.</sub> </p> <table <tr> <td width="50%"><img src="https://raw.githubusercontent.com/nyosegawa/speech.cpp/HEAD/docs/images/page-transcribe.png" alt="Transcribe 탭: Qwen3-ASR 0.6B가 작성한 음성, 영역별로 표시됨. Silero VAD가 음성을 감지하는 영역"><br><sub>Transcribe는 누군가 말하는 영역별로 파일을 쓰거나 녹음을 합니다.</sub></td> <td width="50%"><img src="https://raw.githubusercontent.com/nyosegawa/speech.cpp/HEAD/docs/images/page-live.png" alt="누군가 말할 때의 Live 탭: 첫 번째 문장은 최종화되고, 다음 문장은 말하는 동안 회색으로 표시됨"><br><sub>Live는 사용자가 말하는 마이크를 기록합니다. 회색 텍스트는 아직 발화 중인 음성입니다.</sub></td> </tr> </table>모델 (Models)
| 작업 (Task) | 이름 (Name) | 언어 (Languages) | 강점 (Good at) |
|---|---|---|---|
| 합성 (Synthesis) | qwen3-tts-0.6b, qwen3-tts-1.7b | de en es fr it ja ko pt ru zh | 9명의 이름이 지정된 화자; 첫 프레임(0.08초)부터 스트리밍되는 오디오; 1.7B 모델은 말하는 방법에 대한 지침을 따릅니다 |
| ... |
A 명령은 모델 이름을 통해 모델을 가져오고, Hugging Face에서 해당 이름이 연결된 저장소의 변환 파일을 처음으로 불러옵니다. docs/models.md에는 모델 크기, 목소리 및 언어가 나열되어 있으며, 각 계열별 페이지가 있습니다: Qwen3-TTS, Irodori-TTS, FastConformer, Qwen3-ASR 및 Silero VAD.
설치 (Install)
Apple silicon용 macOS와 x86-64용 Linux:
curl -fsSL https://raw.githubusercontent.com/nyosegawa/speech.cpp/main/install.sh | sh
PowerShell에서 Windows x64:
irm https://raw.githubusercontent.com/nyosegawa/speech.cpp/main/install.ps1 | iex
설치 프로그램은 릴리스 아카이브를 SHA-256으로 확인하고, speech를 홈 폴더에 배치하며, 이를 PATH에 추가합니다. speech update를 실행하거나 다시 실행하면 업데이트됩니다. Linux에서는 Vulkan 로더가 설치된 경우 Vulkan 빌드를 설치하고, 그렇지 않은 경우에는 CPU 빌드를 설치합니다. Linux 빌드는 glibc 2.34 이상이 필요합니다. docs/install.md에는 옵션, 제거 방법, 각 플랫폼에 필요한 사항이 나와 있습니다. Intel Mac 또는 다른 시스템에서는 소스에서 빌드하세요.
빠른 시작
- 문장을 말합니다. 모델은 처음 가져올 때 다운로드됩니다 (1.21 GB):
speech tts qwen3-tts-0.6b --voice ryan -o hello.wav "Hello. It will be sunny in Tokyo tomorrow."
- 텍스트로 다시 작성합니다 (처음 가져올 때 0.84 GB):
speech asr qwen3-asr-0.6b hello.wav
Hello, it will be sunny in Tokyo tomorrow.
- 모델을 선택하고 말하고 전사할 수 있는 페이지를 엽니다:
speech serve --open
speech models는 모든 모델 목록과 각 언어별 기본 시작 모델을 나열합니다.
명령줄 인터페이스 (Command line)
| 하위 명령어 | 기능 |
|---|---|
speech tts | 텍스트를 WAVE 파일 또는 표준 출력(stdout)으로 음성 합성합니다. |
| ... |
speech voice irodori-tts-mf me.wav me.voice.gguf
speech tts irodori-tts-mf --add-voice me=me.voice.gguf --voice me -o - < story.txt | ffplay -nodisp -autoexit -
speech asr reazonspeech-v2 --timestamps meeting.wav
...
모든 요청 옵션은 플래그(flag)이며, speech info MODEL은 모델이 받는 옵션 목록을 보여줍니다. docs/cli.md에는 모든 하위 명령어와 옵션이 나열되어 있습니다.
서버 및 페이지
speech serve는 합성 모델, 인식 모델, 감지 모델을 호스팅하며, 웹 앱, 스크립트 또는 curl을 위해 OpenAI의 오디오 API처럼 POST /v1/audio/speech와 POST /v1/audio/transcriptions에 응답합니다.
speech serve qwen3-tts-0.6b qwen3-asr-0.6b
curl http://127.0.0.1:8080/v1/audio/speech -H 'Content-Type: application/json'
-d '{"input": "Hello.", "voice": "ryan"}' -o hello.wav
...
이는 127.0.0.1에서 수신하며 인증 절차가 없습니다. docs/server.md에 엔드포인트, 형식, 오류 및 페이지가 있습니다.
라이브러리 사용하기
프로그램은 libspeech를 링크하고 릴리스 아카이브에서 speech.h를 포함합니다:
speech_model * model = NULL;
speech_request * request = NULL;
speech_model_load("Qwen3-TTS-12Hz-0.6B-CustomVoice-Q8_0.gguf", NULL, &model);
...
각 호출은 실패 원인을 나타내는 카테고리가 포함된 상태를 반환합니다. docs/c-api.md에 전체 API가 있습니다.
라이브러리 링크를 피하고 싶은 프로그램은 ASIST가 하는 것처럼 speech worker MODEL을 시작하고, JSON Lines 형식으로 통신합니다. 즉, stdin에서 줄당 하나의 요청(오디오 또는 텍스트), stdout에서 하나의 터미널 메시지를 출력합니다. docs/worker.md에 프로토콜이 있습니다.
정확도 및 속도
각 포트의 모든 단계는 공식 구현에서 덤프된 텐서와 비교되었습니다. 인식기는 F32 및 F16 형식으로 모든 확인 입력에 대해 공식 텍스트를 작성합니다.
2026-10-14에 Apple M5 (Metal) 및 RTX 2080 (Vulkan)에서 speech-bench로 측정되었으며, 한 번에 하나의 요청을 처리했습니다. 음성: 시드(seed) 1과 2를 사용한 일본어 문장 20개, 세 라운드 동안 Irodori-TTS가 하나의 레퍼런스 녹음의 목소리로 수행했으며, p50은 첫 오디오까지 걸리는 시간, RTFx는 (걸린 시간을 초로 나눈 오디오의 초, 값이 클수록 빠름)이며, CER은 Qwen3-ASR 1.7B가 들었을 때의 음성 인식률입니다.
| 모델 | Time to first audio, M5 / RTX 2080 | RTFx | CER |
|---|---|---|---|
qwen3-tts-0.6b, Q8_0 | 0.035 s / 0.024 s | 3.7 / 5.2 | 6.4% / 6.0% |
| ... | |||
| 음성 인식(Recognition): Common Voice 8.0의 일본어 테스트 세트 4,483개 발화에 대해 음성으로 트리밍되었으며, 같은 단어의 다른 철자도 괄호 안에 허용하는 CER과 동일한 장치에서의 p50 지연 시간입니다. parakeet-tdt-0.6b-v3는 FLEURS의 영어 발화 300개에 대해 세 라운드를 거쳤습니다. |
| 모델 | Common Voice ja 기준 CER | p50 지연 시간, M5 / RTX 2080 |
|---|---|---|
parakeet-tdt_ctc-0.6b-ja, Q8_0 | 7.9% (3.0%) | 0.045 s / 0.050 s |
| ... | ||
| 각 모델의 페이지에는 더 많은 정보가 있습니다. |
문서(Documentation)
| 페이지 | 내용 |
|---|---|
| 설치 | 설치 프로그램, 업데이트, 제거, 요구 사항, 릴리스 아카이브 및 소스 코드 빌드 |
| ... |
라이선스(License)
MIT이며, LICENSE를 참조하십시오. 모델 가중치는 각 저자의 것입니다:
- Qwen3-TTS와 Qwen3-ASR은 Apache License 2.0에 따라 Qwen 팀의 소유입니다.
- Irodori-TTS v4.1-Small 및 v4.1-Small-MF는 Aratako의 소유이며, 모델 카드에 명시된 윤리적 제한(동의 없는 음성 복제 금지, 딥페이크 또는 허위 정보 유포 금지) 하에 MIT 라이선스를 따릅니다.
- Irodori-TTS v4-Large는 Google의 T5Gemma 2에서 텍스트 인코더를 파생했기 때문에, 동일한 윤리적 제한과 함께 Aratako의 소유이며 Gemma 이용 약관을 따릅니다.
- Irodori-TTS 파일에 포함된 코덱인 Semantic-DACVAE-Japanese-32dim은 MIT 라이선스 하에 Aratako의 소유입니다. 이는 Meta의 facebook/dacvae-watermarked에서 파생되었으며, Apache License 2.0을 따릅니다. 해당 모델 카드의 텍스트가 명시하는 SAM 라이선스는 2025년 12월 19일 facebookresearch/dacvae에서 Apache-2.0으로 수정되었습니다.
- parakeet 모델은 NVIDIA의 소유이며 CC-BY-4.0을 따르고, reazonspeech-nemo-v2는 reazon-research의 소유이며 Apache License 2.0을 따릅니다.
- Silero VAD는 Silero 팀의 소유이며 MIT 라이선스를 따릅니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 개발 자료 GitHub · 56513d9a의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기