아키텍처

네이티브 지시 TTS

네이티브 SDK 지원은 main 소스에서 빌드하세요. Homebrew 등 미리 빌드된 CLI 릴리스에는 이 엔진들이 아직 포함되지 않았을 수 있습니다.

구현 (PR #541): main

공개된 MLX 번들: aufklarer/FireRedTTS3-Instruct-MLX-fp32 · aufklarer/MOSS-VoiceGenerator-MLX-bf16

FireRedTTS3-Instruct — FireRedTTS3TTS: FireRedTTS3-Instruct는 모델과 디코더의 Float32 가중치를 유지합니다. 완성된 오디오를 한 번에 반환하므로 --stream을 생략하세요. --language는 영어와 중국어 별칭을 허용합니다. 생성 한도에 도달하면 잘린 오디오를 성공으로 반환하지 않고 오류를 냅니다.

MOSS-VoiceGenerator — MossVoiceGeneratorTTS: MOSS-VoiceGenerator는 BF16 언어 가중치와 FP32 합성 코덱을 유지합니다. 점진적 PCM에는 --stream을 사용하세요. --language를 생략하고 언어 요구사항을 --instruct에 넣으세요. 종료 전에 열여섯 코드북을 모두 비웁니다.

텍스트와 지시 필드는 각각 UTF-8 32,768바이트로 제한됩니다. 템플릿을 포함해 렌더링한 전체 입력 프롬프트는 4,096토큰 이하여야 합니다. 어느 한도든 넘으면 입력을 거부합니다.

지시 준수 품질은 아직 채점하지 않았습니다. 짧은 대본 측정은 시험한 구성만 설명하며 기존 모델의 지연 회귀 검증은 결론을 내리지 못했습니다.

Breeze TTS 2 · BreezeTTS

영어·중국어 음성 합성, 음성 디자인, 참조 음성 복제 및 연출, 스트리밍 오디오 지원 (MLX BF16/8-bit, 24 kHz; 연구·비상업용 라이선스).

BreezeTTS · CLI · Swift API

speech speak "The quick brown fox jumps over the lazy dog." --engine breeze \
  --instruct "A clear, calm English narrator." --stream -o design.wav
  • --breeze-model-id: aufklarer/Breeze-TTS-2-MLX-8bit
  • --breeze-bundle-dir
  • --breeze-cache-limit-mib
  • --breeze-reference-text
  • --breeze-temperature: 0.9
  • --breeze-top-k: 50
  • --breeze-top-p: 1
  • --breeze-cfg-scale: 4
  • --breeze-max-frames: 750
  • --breeze-seed: 42
  • --first-chunk-frames: 3
  • --chunk-frames: 25

Apple 네이티브 런타임 · PocketTTS

PocketTTS는 speech-swift에 네이티브 CoreML 음성 합성을 추가합니다. 모든 단계는 기본적으로 CPU만 사용합니다. 영어 Alba 프리셋은 24 kHz에서 프레임당 1,920개 샘플(80밀리초)을 스트리밍합니다.

Swift 및 CLI 사용법

speech-swift는 공유 프로토콜, 독립적인 모델 모듈, 통합 CLI를 갖춘 모듈식 Swift 패키지로 구성되어 있습니다. 모든 추론은 MLX (Metal GPU) 또는 CoreML (Neural Engine)을 사용해 온디바이스에서 실행됩니다.

모듈 종속성 그래프

                    ┌──────────┐
                    │ AudioCLI │  (entry point)
                    └────┬─────┘
                         │
                  ┌──────┴──────┐
                  │ AudioCLILib │  (commands)
                  └──────┬──────┘
                         │
       ┌─────────┬───────┼───────┬──────────┬──────────────┐
       │         │       │       │          │              │
  ┌────┴───┐ ┌──┴──┐ ┌──┴──┐ ┌─┴────┐ ┌───┴────┐ ┌──────┴───────┐
  │Qwen3ASR│ │Qwen3│ │Cosy │ │Perso-│ │Speech- │ │  Speech-     │
  │Parakeet│ │ TTS │ │Voice│ │naPlex│ │  VAD   │ │Enhancement   │
  └────┬───┘ └──┬──┘ └──┬──┘ └──┬───┘ └───┬───┘ └──────┬───────┘
       │        │       │       │         │             │
       └────────┴───────┼───────┴─────────┘             │
                        │                               │
                 ┌──────┴──────┐                        │
                 │ Qwen3Common │  (shared layers)       │
                 └──────┬──────┘                        │
                        │                               │
                 ┌──────┴──────┐                        │
                 │ AudioCommon │ ◄──────────────────────┘
                 └─────────────┘  (protocols, audio I/O)

MLX 버퍼 캐시 예산

MLX 모델 런타임은 가중치 로딩부터 모델 수명이 끝날 때까지 재사용 버퍼의 기본 한도 min(2 GiB, physical RAM / 4)를 공유합니다. MLX.Memory.cacheLimit = 0을 포함한 더 낮은 호출자 예산과 기존 모델별 예산을 유지합니다. 이 한도는 유휴 버퍼에 적용되며, 사용 중인 가중치, KV 캐시와 전체 프로세스 메모리는 한도를 초과할 수 있습니다. MLX는 할당 시 캐시를 정리하므로 마지막으로 해제된 버퍼 때문에 다음 할당 전까지 캐시가 일시적으로 예산을 초과할 수 있습니다.

unload()는 모델의 등록을 해제하며, 이 메서드가 없는 런타임은 소멸 시 해제합니다. 마지막 소유자가 해제되면 호출자 예산을 복원하고, 그 전에는 남은 모델의 한도를 유지합니다. CoreML 전용 경로는 MLX 예산을 등록하지 않습니다.

MOSS Transcribe Diarize

MossTranscribe는 네이티브 CoreML 및 MLX 백엔드로 화자 정보가 있는 타임스탬프 구간을 반환합니다. CoreML은 짧은 녹음용 고정 1,024-token 상태를 사용하고, MLX는 동적 131,072-token 컨텍스트, affine INT5/INT8 디코더 가중치 및 선택적 FP16/INT8 KV 캐시를 사용합니다. 둘 다 스트리밍이 아닌 오프라인 자기회귀 런타임입니다.

VoiceChat 11B

작업 및 참고: 전이중 speech-to-speech. SALM-Duplex: Efficient and Direct Duplex Modeling for Speech-to-Speech Language Model (Interspeech 2025)을 NVIDIA 업스트림 VoiceChat 모델 카드가 인용합니다.

전체 런타임, M5 Pro 48 GB, Release, 80 ms 라이브 주기: 보호된 헤드 INT5의 피크 RSS는 약 8.69 GB이며, 제어된 3회의 전체 파이프라인 RTF는 0.96, 0.96, 0.99였습니다. 최적화된 INT8 성능은 아직 재측정하지 않았습니다.

VoiceChat는 인과 FastConformer 인식, Nemotron-H 전이중 텍스트/함수 채널, 8회 MaskGIT 반복을 사용하는 독립 텍스트 조건부 EAR-TTS 디코더, 22.05 kHz 신경 코덱으로 구성된 완전한 네이티브 MLX 오디오-오디오 경로를 구현합니다. 스트리밍은 계층별 유한 어텐션과 인과 합성곱 캐시를 유지하고, 정상 상태의 8프레임 라이브 코덱 윈도우는 컴파일된 그래프를 사용합니다. 각 80 ms 입력 프레임은 언어 결정, 31개 RVQ 코드, 정확히 1,764개 출력 샘플을 생성합니다. 로더는 완전한 encoder/ + llm/ + tts/ bundle을 요구하며 이전 이해 전용 내보내기를 거부합니다. INT5는 테스트한 M5 Pro에서 평균 RTF 1 미만을 유지하지만 프레임별 p95 여유는 아직 좁습니다.

추론 백엔드

백엔드하드웨어모델
MLX Metal GPU Qwen3-ASR, Qwen3-TTS, Breeze TTS 2, CosyVoice3, IndexTTS2, Qwen3.5-Chat, PersonaPlex, VoiceChat 11B, Omnilingual ASR (300M / 1B / 3B / 7B), Cohere Transcribe 2B, Voxtral Mini 3B, Pyannote, Silero VAD, WeSpeaker, MOSS Transcribe Diarize, SpeechBrain ECAPA LID, Nemotron 3 Diarization, FireRedTTS3-Instruct, MOSS-VoiceGenerator
CoreML CPU / GPU / Neural Engine (ANE) Qwen3-ASR 인코더 (하이브리드), Parakeet TDT, Parakeet EOU 스트리밍, Omnilingual ASR 300M, Kokoro-82M, Qwen3.5-Chat (옵션), Sortformer 화자 분리, DeepFilterNet3, Silero VAD (옵션), WeSpeaker (옵션), MOSS Transcribe Diarize, SpeechBrain ECAPA LID, Nemotron 3 Diarization
Accelerate CPU (SIMD) 오디오 전처리 (STFT, 멜, FFT), 신호 처리

모델 웨이트 포맷

MLX 모델은 4비트 또는 8비트 양자화 (그룹 크기 64)를 적용한 safetensors 포맷을 사용합니다. CoreML 모델은 컴파일된 .mlmodelc 포맷을 사용합니다. scripts/의 변환 스크립트가 PyTorch 체크포인트로부터 변환합니다.

Cohere와 Voxtral은 MLX 어파인 INT5 번들도 제공합니다. MLX는 어파인 INT7을 지원하지 않으며, 더 높은 품질의 지원 옵션은 INT8입니다.

모델파라미터양자화디스크 크기
Qwen3-ASR 0.6B (MLX)약 600M4비트 / 8비트680 MB / 1.0 GB
Qwen3-ASR 0.6B (CoreML)약 186M (인코더)INT8약 180 MB
Qwen3-ASR 1.7B (MLX)약 1.7B4비트 / 8비트2.1 GB / 3.2 GB
Parakeet-TDT 0.6B (CoreML)약 600MINT8500 MB
Whisper Large-v3 Turbo (CoreML)809MFP161.6 GB
MOSS Transcribe Diarize 0.9B (MLX)908.5MFP16 audio + INT5 / INT8 decoder987.0 MiB / 1,200.1 MiB
MOSS Transcribe Diarize 0.9B (CoreML)~900MFP16 / INT8 block-321.7 GB / 1.2 GB
Parakeet-EOU 120M (CoreML)약 120MINT8약 120 MB
Omnilingual-ASR-CTC 300M (CoreML)326MINT8312 MB
Omnilingual-ASR-CTC 300M (MLX)326M4비트 / 8비트193 MB / 342 MB
Omnilingual-ASR-CTC 1B (MLX)1.01B4비트 / 8비트549 MB / 1006 MB
Omnilingual-ASR-CTC 3B (MLX)약 3B4비트 / 8비트1.71 GB / 3.16 GB
Omnilingual-ASR-CTC 7B (MLX)약 7B4비트 / 8비트3.55 GB / 6.63 GB
Cohere Transcribe 2B (MLX)2BFP16 / INT5 / INT83.85 / 1.62 / 2.25 GiB
Voxtral Mini 3B 2507 (MLX)3BFP16 / INT5 / INT88.71 / 3.77 / 5.18 GiB
Qwen3-ForcedAligner 0.6B (MLX)약 600M4비트 / 8비트979 MB / 1.4 GB
Qwen3-ForcedAligner 0.6B (CoreML)약 600MINT4 / INT8630 MB / 1.0 GB
Qwen3-TTS 0.6B (MLX)약 600M4비트 / 8비트1.7 GB / 2.4 GB
Qwen3-TTS 1.7B (MLX)약 1.7B4비트 / 8비트3.2 GB / 4.8 GB
CosyVoice3 0.5B (MLX)약 500M4비트 LLM약 1.2 GB
IndexTTS2 expanded bundle (MLX)1.5B-classFP16 + auxiliary models~4.8 GB
Kokoro-82M (CoreML)82MINT8 (1 버킷)약 89 MB
Qwen3.5-Chat 0.8B (MLX)약 800MINT4418 MB
Qwen3.5-Chat 0.8B (CoreML)약 800MINT8981 MB
PersonaPlex 7B (MLX)약 7B4비트 / 8비트4.9 GB / 9.1 GB
VoiceChat 11B (MLX)~11BINT5 / INT88.56 GB / 12.11 GB
Pyannote VAD (MLX)약 1.49Mfloat32약 5.7 MB
Silero VAD v5약 309Kfloat32약 1.2 MB (MLX 및 CoreML)
p99 turn-1-mini5.3MFloat3222 MB (CoreML)
VAP (otoSpeech)5.8MFloat3239 MB (CoreML) / 40 MB (ONNX)
WeSpeaker ResNet34약 6.6Mfloat32약 25 MB (MLX 및 CoreML)
SpeechBrain ECAPA VoxLingua10721.25MFP16~40.6 MiB (MLX) / ~40.8 MiB (CoreML)
ReDimNet2-B612.3Mfloat16약 25 MiB (CoreML)
Pyannote Community-1 (CoreML)8.35Mfloat32 + native VBx~32 MB
Nemotron 3 Diarization (CoreML / MLX)100MINT8~100 MB per backend
Sortformer (CoreML)—float16약 50 MB
DeepFilterNet3 (CoreML)약 2.1MFP16약 4.2 MB
LocalVQE v1.4-AEC (CoreML + C++)200K + 2,742FP16 + FP32약 732 KB

MLX 모델 초기화

QuantizedLinear.preQuantized는 체크포인트에서 불러오는 양자화 선형 계층에 0으로 된 자리표시자를 만들어 무작위 가중치와 임시 양자화 그래프 생성을 피합니다. withThrowawayRandomState는 폐기할 부동소수점 초기화가 호출자의 난수 키 체인에 연결되지 않도록 격리합니다. 복합 모델 로더는 MAGNeT의 T5와 EnCodec, Stable Audio 3의 T5Gemma와 SAME-L, CSM의 Mimi 코덱 등 각 구성 요소에 별도 범위를 적용합니다. CSM의 양자화 임베딩은 여전히 업스트림 초기화 함수를 사용하므로 초기화 그래프 수명에 관한 알려진 제약이 남아 있습니다.

성능 최적화

오디오 처리

모든 오디오 I/O는 Float32 PCM을 사용합니다. 내부 리샘플링이 포맷 변환을 처리합니다:

모델요구 샘플레이트포맷
Qwen3-ASR16 kHz모노 Float32
Cohere Transcribe 2B16 kHzMono Float32
Voxtral Mini 3B16 kHzMono Float32
Qwen3-TTS24 kHz 출력모노 Float32
CosyVoice324 kHz 출력모노 Float32
Kokoro-82M24 kHz 출력모노 Float32
PersonaPlex24 kHz I/O모노 Float32
Pyannote VAD16 kHz모노 Float32
Silero VAD16 kHz모노 Float32
WeSpeaker16 kHz모노 Float32
SpeechBrain ECAPA LID16 kHzMono Float32
ReDimNet2-B616 kHz모노 Float32
DeepFilterNet348 kHz모노 Float32

소스 구조

Sources/
  AudioCommon/            공유 프로토콜, 오디오 I/O, 시스템 출력 캡처(SystemAudioTap),
                          HuggingFace 다운로더, SentencePieceModel(protobuf 리더)
  MLXCommon/              MLX 유틸리티: 웨이트 로딩, QuantizedLinear 헬퍼,
                          SDPA 멀티헤드 어텐션 헬퍼, metal budget
  Qwen3Common/            공유 모델 컴포넌트 (KV 캐시, RoPE, 양자화)
  Qwen3ASR/               Qwen3-ASR 음성-텍스트 변환
  ParakeetASR/            Parakeet TDT 음성-텍스트 변환 (CoreML)
  ParakeetStreamingASR/   Parakeet EOU 120M 스트리밍 받아쓰기 (CoreML)
  OmnilingualASR/         Meta wav2vec2 + CTC, 1,672개 언어
                          (CoreML 300M + MLX 300M / 1B / 3B / 7B)
  CohereTranscribeASR/  Cohere Transcribe 2B speech-to-text (MLX)
  VoxtralASR/            Voxtral Mini 3B speech-to-text (MLX)
  Qwen3TTS/               Qwen3-TTS 텍스트-음성 변환
  FireRedTTS3TTS/         FireRedTTS3-Instruct (MLX, Float32)
  MossVoiceGeneratorTTS/  MOSS-VoiceGenerator (MLX, BF16 + FP32)
  CosyVoiceTTS/           CosyVoice3 텍스트-음성 변환
  KokoroTTS/              Kokoro-82M 텍스트-음성 변환 (CoreML)
  Qwen3Chat/              Qwen3.5-0.8B 온디바이스 LLM 채팅 (MLX + CoreML)
  PersonaPlex/            PersonaPlex 음성-음성 변환
  SpeechVAD/              VAD (Silero + Pyannote), 화자 분리, 화자 임베딩
  SpeechLanguageID/       음성 언어 식별(SpeechBrain ECAPA, MLX + CoreML, 107개 레이블)
  SpeechEnhancement/      DeepFilterNet3 노이즈 억제 (CoreML)
  SourceSeparation/       Open-Unmix HQ / UMX-L + HTDemucs (Demucs v4) music source separation (MLX, 4 stems)
  MAGNeTMusicGen/         MAGNeT text-to-music generation (MLX, 30 s @ 32 kHz, INT4/INT8)
  VoxCPM2TTS/             VoxCPM2 text-to-speech (MLX, 48 kHz, voice cloning + voice design)
  IndexTTS2TTS/           IndexTTS2 voice cloning (MLX, semantic GPT + emotion/tempo/pause control + S2Mel + BigVGAN)
  VibeVoiceTTS/           VibeVoice long-form / multi-speaker TTS (MLX, EN/ZH)
  MADLADTranslation/      MADLAD-400 many-to-many translation (MLX, 400+ languages)
  GLiNER/                 GLiNER2.5-Decide classification + entity spans (MLX, INT8/FP16/FP32)
  AudioCLILib/            CLI 명령 구현
  AudioCLI/               CLI 진입점

scripts/              모델 변환 (PyTorch → MLX/CoreML), 벤치마킹
Tests/                단위 및 통합 테스트
Examples/             데모 앱 (PersonaPlexDemo, SpeechDemo)

GLiNER2.5-Decide: MLX 네이티브 분류와 엔터티 스팬(INT8, FP16, FP32 가중치). 추론에 Python이 필요하지 않습니다.

⚠ Translation out of date — English guide. The new Clef section below awaits translation.

Clef-flash: development preview of local text decisions (9B, affine 4-bit MLX), with a joint schema head and a separate output-embedding prior.

MOSS-TTS-Nano

CoreML 기반 스트리밍 음성 합성과 음성 복제. 48 kHz 스테레오를 80 ms 청크로 출력합니다.

MossTTSNanoModel은 요청을 직렬화하며 발화마다 새 CoreML 상태를 만듭니다. synthesize와 synthesizeStream은 스테레오를 유지하고 SpeechGenerationModel은 모노 믹스를 반환합니다. language: nil을 전달하세요. 스트림은 빈 최종 마커로 끝납니다.

macOS 15+ / iOS 18+가 필요하며 컴파일된 모델 4개는 총 367.6 MB입니다. 프롬프트, 참조, 요청 프레임은 1,024행 컨텍스트를 공유합니다. 초과하거나 자연 종료 전에 maxFrames에 도달하면 오류가 발생합니다. 기본은 CPU이며 gpu는 CPU+GPU를 허용합니다. PCG64 시드는 NumPy와 호환되지만 백엔드 수치 차이로 출력이 달라질 수 있습니다.

MOSS-TTS-Nano

선택적 모델 관리

SpeechRuntime은 공유 로딩, 취소 가능한 FIFO 진입 제어, 직렬 실행을 제공합니다. Qwen3ASRRuntime은 명시적 설명자로 MLX 또는 전체 CoreML을 선택하며 기존 API와 CLI 플래그도 계속 사용할 수 있습니다.

서버는 스트리밍 출력을 포함한 전체 요청 동안 실행 허가를 유지하며 최대 32개 요청을 대기시킵니다. ASR 실패는 HTTP 오류 또는 WebSocket 오류 이벤트로 전달되고 유효한 빈 전사는 성공으로 처리됩니다. 재생은 넘치는 샘플을 보관합니다. 캐시된 모델과 재생 대기 오디오는 메모리를 차지합니다.

Voxtral TTS

Voxtral 4B TTS 2603은 VoxtralTTS 모듈로 Apple Silicon에서 로컬 실행되며, 프리셋 음성 20개, 언어 9개, 24 kHz 모노 음성을 지원합니다.

VoxtralTTS → 26-layer LM → 3-layer acoustic transformer → 24 kHz PCM

사전 설정 음성만 지원하며 참조 오디오 복제는 지원하지 않습니다. SDK, CLI, WebSocket 및 HTTP PCM에서 생성 중인 오디오를 출력합니다. 입력 텍스트는 처음에 전체를 제공해야 합니다. 모델 가중치는 CC BY-NC 4.0 라이선스를 사용합니다.

Voxtral TTS 가이드 읽기

Fish Audio Drama 3

Drama 3의 실험적 네이티브 MLX 지원은 FishAudioDrama3Model로 제공됩니다. 350억 매개변수의 혼합 어텐션 MoE, 시간축 오디오 타워와 Fish DAC 코덱으로 44.1 kHz 모노 오디오를 생성합니다. 4비트 체크포인트는 Apple M5 Pro에서 텍스트 생성, 참조 음성 복제 및 CLI 출력의 파형과 독립 ASR 검증을 통과했습니다. 8비트와 BF16은 아직 검증되지 않았습니다.

기본 balanced 모드는 단계 경계에서 512 MiB를 초과하는 유휴 MLX 버퍼를 정리합니다. 모델 수명 동안 공유 캐시 한도도 적용되며 더 낮은 호출자 예산을 유지합니다. 두 제어 모두 전체 프로세스 메모리 한도는 아닙니다. --fish-drama3-memory-mode unrestricted 또는 memoryOptions: .unrestricted는 가중치를 미리 로드하고 단계별 정리를 생략하지만 모델 수명의 한도는 유지합니다.

텍스트만 생성할 때는 참조 인코더 가중치 794.4 MiB의 로딩을 지연합니다. 첫 참조 인코딩에서 로드한 후 유지하므로 그때까지 codec.safetensors 파일을 사용할 수 있어야 합니다. 미리 계산한 참조 코드에는 인코더가 필요하지 않습니다.

FishAudioTTS: FishAudioDrama3Model · backbone.model.* · semantic_head.* · tower.* · codec.safetensors

Fish Audio로 제작되었습니다. 번들에 Community License와 NOTICE가 포함됩니다.

4비트 벤치마크

generateStreaming, generateStream, --stream으로 PCM 스트리밍을 지원합니다. 기본 청크는 코덱 프레임 3개로 약 139ms의 오디오입니다. 긴 텍스트 자동 분할과 스트리밍 텍스트 입력은 아직 지원하지 않습니다.

타워의 각 코드북은 4,096개의 토큰 값을 사용합니다. 버퍼링 및 스트리밍 Fish DAC 디코딩은 모두 잔차 코드를 코덱의 1,024개 항목 잔차 코드북 범위로 제한합니다. 반환되는 코드북은 타워의 원래 값을 유지합니다.

잘못된 회전 위치 임베딩 차원은 모델 가중치를 로드하기 전에 거부됩니다.