--- name: mlx.audio description: Generate speech from text and transcribe audio using mlx-audio. Use when the user wants text-to-speech synthesis, speech-to-text transcription, voice cloning, audio separation, or speech-to-speech processing on Apple Silicon. --- # MLX-Audio A speech processing library built on Apple's MLX framework, providing TTS, STT, speech-to-speech (STS), and audio separation optimized for Apple Silicon. - **Repository:** https://github.com/Blaizzy/mlx-audio - **License:** MIT ## CLI Tools ### Text-to-Speech (TTS) ```bash mlx_audio.tts.generate --model --text '' [options] ``` | Flag | Type | Default | Description | |------|------|---------|-------------| | `--model` | string | required | HuggingFace model ID | | `--text` | string | required | Text to synthesize | | `--voice` | string | — | Voice preset (model-specific) | | `--speed` | float | 1.0 | Speech speed multiplier | | `--lang_code` | string | `a` | Language code | | `--play` | flag | — | Play audio immediately | | `--output_path` | string | — | Directory to save audio | | `--ref_audio` | string | — | Reference audio for voice cloning (CSM) | #### Language Codes | Code | Language | |------|----------| | `a` | American English | | `b` | British English | | `j` | Japanese | | `z` | Mandarin Chinese | | `e` | Spanish | | `f` | French | #### Kokoro Voices | Voice | Description | |-------|-------------| | `af_heart`, `af_bella`, `af_nova`, `af_sky` | American female | | `am_adam`, `am_echo` | American male | | `bf_alice`, `bf_emma` | British female | | `bm_daniel`, `bm_george` | British male | | `jf_alpha`, `jm_kumo` | Japanese | | `zf_xiaobei`, `zm_yunxi` | Chinese | #### Examples ```bash # Basic generation mlx_audio.tts.generate --model mlx-community/Kokoro-82M-bf16 --text 'Hello, world!' --lang_code a # With voice and speed mlx_audio.tts.generate --model mlx-community/Kokoro-82M-bf16 --text 'Hello!' --voice af_heart --speed 1.2 --lang_code a # Play immediately mlx_audio.tts.generate --model mlx-community/Kokoro-82M-bf16 --text 'Hello!' --play --lang_code a # Voice cloning with CSM mlx_audio.tts.generate --model mlx-community/csm-1b --text "Hello from Sesame." --ref_audio ./reference_voice.wav --play ``` ### Speech-to-Text (STT) ```bash python -m mlx_audio.stt.generate --model --audio [options] ``` | Flag | Type | Default | Description | |------|------|---------|-------------| | `--model` | string | required | HuggingFace model ID | | `--audio` | string | required | Input audio file | | `--language` | string | — | Language code | | `--max-tokens` | int | 1024 | Maximum output tokens | | `--temperature` | float | 0.0 | Sampling temperature | | `--context` | string | — | Hotwords/metadata for context | | `--output-path` | string | — | Output directory | | `--format` | string | — | Output format (e.g. `json`) | | `--stream` | flag | — | Enable streaming mode | | `--verbose` | flag | — | Detailed logging | #### Examples ```bash # Basic transcription python -m mlx_audio.stt.generate --model mlx-community/whisper-large-v3-turbo-asr-fp16 --audio speech.wav --verbose # With context for technical terms python -m mlx_audio.stt.generate --model mlx-community/VibeVoice-ASR-bf16 --audio meeting.wav --context "MLX, Apple Silicon, PyTorch" --max-tokens 8192 --format json --verbose # Parakeet model python -m mlx_audio.stt.generate --model mlx-community/parakeet-tdt-0.6b-v3 --audio speech.wav --format json --verbose ``` --- ## Python API ### TTS ```python from mlx_audio.tts.utils import load_model model = load_model("mlx-community/Kokoro-82M-bf16") for result in model.generate("Hello from MLX-Audio!", voice="af_heart"): audio = result.audio # mx.array waveform ``` ### STT ```python from mlx_audio.stt.generate import generate_transcription result = generate_transcription( model="mlx-community/whisper-large-v3-turbo-asr-fp16", audio="audio.wav", ) print(result.text) ``` ### STT with Streaming ```python from mlx_audio.stt import load # VibeVoice-ASR streaming model = load("mlx-community/VibeVoice-ASR-bf16") for text in model.stream_transcribe(audio="speech.wav", max_tokens=4096): print(text, end="", flush=True) # Parakeet streaming model = load("mlx-community/parakeet-tdt-0.6b-v3") for chunk in model.generate("long_audio.wav", stream=True): print(chunk.text, end="", flush=True) ``` ### Forced Alignment (Qwen3) ```python from mlx_audio.stt import load aligner = load("mlx-community/Qwen3-ForcedAligner-0.6B-8bit") result = aligner.generate("audio.wav", text="I have a dream", language="English") for item in result: print(f"[{item.start_time:.2f}s - {item.end_time:.2f}s] {item.text}") ``` --- ## REST API Server (OpenAI-compatible) ### Starting the Server ```bash python -m mlx_audio.server [OPTIONS] ``` | Flag | Type | Default | Description | |------|------|---------|-------------| | `--host` | string | `localhost` | Server host | | `--port` | int | `8000` | Server port | | `--allowed-origins` | string | `*` | CORS allowed origins | | `--workers` | int/float | `2` | Number of workers | | `--reload` | flag | — | Enable auto-reload | | `--start-ui` | flag | — | Launch Studio UI alongside API | | `--log-dir` | string | `logs` | Directory for server logs | ### Endpoints #### GET /v1/models List available models. ```bash curl http://localhost:8000/v1/models ``` #### POST /v1/models?model_name=\ Add a model to the server. #### DELETE /v1/models?model_name=\ Remove a model from the server. #### POST /v1/audio/speech Generate speech from text. ```bash curl -X POST http://localhost:8000/v1/audio/speech \ -H "Content-Type: application/json" \ -d '{ "model": "mlx-community/Kokoro-82M-bf16", "input": "Hello, world!", "voice": "af_heart", "speed": 1.0, "lang_code": "a", "response_format": "mp3" }' --output speech.mp3 ``` | Parameter | Type | Default | Description | |-----------|------|---------|-------------| | `model` | string | required | Model ID | | `input` | string | required | Text to synthesize | | `voice` | string | — | Voice preset | | `speed` | float | 1.0 | Speech speed | | `lang_code` | string | `a` | Language code | | `ref_audio` | string | — | Reference audio path (voice cloning) | | `ref_text` | string | — | Reference transcript | | `response_format` | string | `mp3` | Output format | | `stream` | bool | false | Enable streaming | | `streaming_interval` | float | 2.0 | Streaming chunk interval | | `temperature` | float | 0.7 | Sampling temperature | | `top_p` | float | 0.95 | Nucleus sampling | | `top_k` | int | 40 | Top-k sampling | | `repetition_penalty` | float | 1.0 | Repetition penalty | | `max_tokens` | int | 1200 | Maximum tokens | | `gender` | string | `male` | Gender hint | | `pitch` | float | 1.0 | Pitch adjustment | | `instruct` | string | — | Instruction text | #### POST /v1/audio/transcriptions Transcribe an audio file (multipart/form-data). ```bash curl -X POST http://localhost:8000/v1/audio/transcriptions \ -F file=@audio.wav \ -F model=mlx-community/whisper-large-v3-turbo-asr-fp16 ``` | Parameter | Type | Default | Description | |-----------|------|---------|-------------| | `file` | file | required | Audio file | | `model` | string | required | Model ID | | `language` | string | — | Language code | | `max_tokens` | int | 1024 | Maximum tokens | | `chunk_duration` | float | 30.0 | Chunk duration (seconds) | | `stream` | bool | false | Enable streaming | | `context` | string | — | Hotwords/context | | `text` | string | — | Reference text | | `verbose` | bool | false | Detailed output | Response (NDJSON stream): ```json {"text": "chunk text", "accumulated": "full text so far"} ``` #### WebSocket /v1/audio/transcriptions/realtime Real-time transcription via WebSocket. Send initial config as JSON, then stream int16 PCM audio as binary frames. ```json { "model": "mlx-community/whisper-large-v3-turbo-asr-fp16", "sample_rate": 16000, "streaming": true } ``` #### POST /v1/audio/separations Separate audio sources (multipart/form-data). ```bash curl -X POST http://localhost:8000/v1/audio/separations \ -F file=@audio.wav \ -F model=mlx-community/sam-audio-large-fp16 \ -F description="speech" ``` | Parameter | Type | Default | Description | |-----------|------|---------|-------------| | `file` | file | required | Audio file | | `model` | string | `mlx-community/sam-audio-large-fp16` | Model ID | | `description` | string | `speech` | Target description | | `method` | string | `midpoint` | ODE method (`midpoint` or `euler`) | | `steps` | int | 16 | ODE steps (2/4/8/16/32) | Response: ```json { "target": "", "residual": "", "sample_rate": 44100 } ``` --- ## Supported Models ### TTS Models | Model | Languages | Notes | |-------|-----------|-------| | Kokoro | EN, JA, ZH, FR, ES, IT, PT, HI | Fast, high-quality multilingual | | Qwen3-TTS | ZH, EN, JA, KO, + more | Voice design via instruction | | CSM | EN | Voice cloning with reference audio | | Dia | EN | Dialogue-focused | | OuteTTS | EN | Efficient | | Spark | EN, ZH | SparkTTS | | Chatterbox | EN, ES, FR, DE, IT, PT, PL, TR, RU, NL, CS, AR, ZH, JA, HU, KO | Expressive multilingual | | Soprano | EN | High-quality | ### STT Models | Model | Languages | Notes | |-------|-----------|-------| | Whisper | 99+ languages | OpenAI's robust model | | Qwen3-ASR | ZH, EN, JA, KO, + more | Alibaba multilingual | | Qwen3-ForcedAligner | ZH, EN, JA, KO, + more | Word-level alignment | | Parakeet | EN (v2), 25 EU languages (v3) | NVIDIA, high accuracy | | Voxtral | Multiple | Mistral speech model | | Voxtral Realtime | Multiple | 4B streaming STT | | VibeVoice-ASR | Multiple | Microsoft 9B, supports diarization and context | ### Other Models | Model | Type | Description | |-------|------|-------------| | Sortformer v1/v2.1 | VAD/Diarization | Speaker diarization (up to 4 speakers) | | SAM-Audio | Separation | Text-guided source separation | | Liquid2.5-Audio | STS | Speech/text-to-speech and STT | | MossFormer2 SE | Enhancement | Speech enhancement / noise removal | Models are available from `mlx-community` on HuggingFace with various quantization levels (3-bit through 8-bit and fp16/bf16). ## Source - Repository: https://github.com/Blaizzy/mlx-audio - HuggingFace: https://huggingface.co/mlx-community