A local macOS text-to-speech app that mirrors the model choices in
../Local_TTS, but points at original upstream model backends instead of
mlx-community/* conversions.
Generation runs in offline mode by default. The app and runner set Hugging Face
Hub and Transformers offline flags before loading any backend, so missing model
files fail instead of being downloaded. Model IDs such as hexgrad/Kokoro-82M
can still be used as keys for an existing local cache, and local model folders
can be passed in the Model field when supported by the backend. The runner also
blocks non-loopback socket connections from backend code.
The app includes the same families exposed by the MLX version:
sesame/csm-1bk2-fsa/OmniVoicemeituan-longcat/LongCat-AudioDiT-1BQwen/Qwen3-TTS-12Hz-1.7B-CustomVoiceQwen/Qwen3-TTS-12Hz-0.6B-CustomVoicehexgrad/Kokoro-82Mmistralai/Voxtral-4B-TTS-2603Model, backend, language, and voice are separate controls in both the native macOS app and the Python fallback GUI.
Install the system speech dependency used by Kokoro:
brew install espeak-ng
Then create and install a Python environment. Python 3.10 or newer is
recommended; if you kept the standalone Python from ../Local_TTS, you can use
it here too:
../Local_TTS/.python/python/bin/python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -r requirements-kokoro.txt
If that sibling Python is not present, use another Python 3.10+ executable for
the venv command.
Some original backends have additional constraints:
.venv installed with
requirements-kokoro.txt.transformers==4.57.3, while OmniVoice requires transformers>=5.3.0.
Use a separate venv for OmniVoice:../Local_TTS/.python/python/bin/python3 -m venv .venv-omnivoice
source .venv-omnivoice/bin/activate
python -m pip install --upgrade pip
python -m pip install -r requirements-omnivoice.txt
meituan-longcat/LongCat-AudioDiT project dependencies if the audiodit
package is not importable.vllm serve mistralai/Voxtral-4B-TTS-2603 --omni
The app's Voxtral preset includes --server_url http://127.0.0.1:8000/v1 in
Extra flags.
This app does not download model weights during generation. Before running a preset, make sure its model is already present in the local Hugging Face cache or copy the model into a local folder and use that path in the Model field. Use the Model panel's Check Update button when you intentionally want to check Hugging Face and refresh the selected repo-id model cache. That button is the only app workflow that enables external network access.
Kokoro supports a local folder shaped like this:
models/Kokoro-82M/
config.json
kokoro-v1_0.pth
voices/
af_heart.pt
Then use models/Kokoro-82M as the Model value. Other from_pretrained
backends can use either an existing cache entry or a local model directory.
Voxtral requests are restricted to loopback URLs such as 127.0.0.1 or
localhost; the vLLM server itself must also have its model files locally
available.
./build_macos_app.sh
open "build/OG Local TTS.app"
The app defaults to .venv/bin/python when it exists. If dependencies are
installed in another environment, use the Python field in the app to choose that
interpreter.
python og_tts_gui.py
Both the native app and Python fallback save generated audio under outputs/ by
default.
Kokoro:
python og_tts_runner.py \
--backend kokoro \
--model hexgrad/Kokoro-82M \
--text "Hello from original Kokoro." \
--lang_code a \
--voice af_heart \
--join_audio \
--output_path outputs
Qwen CustomVoice:
python og_tts_runner.py \
--backend qwen \
--model Qwen/Qwen3-TTS-12Hz-0.6B-CustomVoice \
--text "Hello from original Qwen TTS." \
--lang_code English \
--voice Ryan \
--join_audio \
--output_path outputs
OmniVoice voice cloning:
python og_tts_runner.py \
--backend omnivoice \
--model k2-fsa/OmniVoice \
--text "Hello from original OmniVoice." \
--ref_audio sample.wav \
--ref_text "Transcript of the sample." \
--join_audio \
--output_path outputs
mlx-audio, mlx-lm, or MLX
model repos.mlx-community/* model ids.5 commits
Python
52.8%
Swift
44.3%
Shell
2.9%
A local macOS text-to-speech app that mirrors the model choices in
../Local_TTS, but points at original upstream model backends instead of
mlx-community/* conversions.
Generation runs in offline mode by default. The app and runner set Hugging Face
Hub and Transformers offline flags before loading any backend, so missing model
files fail instead of being downloaded. Model IDs such as hexgrad/Kokoro-82M
can still be used as keys for an existing local cache, and local model folders
can be passed in the Model field when supported by the backend. The runner also
blocks non-loopback socket connections from backend code.
The app includes the same families exposed by the MLX version:
sesame/csm-1bk2-fsa/OmniVoicemeituan-longcat/LongCat-AudioDiT-1BQwen/Qwen3-TTS-12Hz-1.7B-CustomVoiceQwen/Qwen3-TTS-12Hz-0.6B-CustomVoicehexgrad/Kokoro-82Mmistralai/Voxtral-4B-TTS-2603Model, backend, language, and voice are separate controls in both the native macOS app and the Python fallback GUI.
Install the system speech dependency used by Kokoro:
brew install espeak-ng
Then create and install a Python environment. Python 3.10 or newer is
recommended; if you kept the standalone Python from ../Local_TTS, you can use
it here too:
../Local_TTS/.python/python/bin/python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -r requirements-kokoro.txt
If that sibling Python is not present, use another Python 3.10+ executable for
the venv command.
Some original backends have additional constraints:
.venv installed with
requirements-kokoro.txt.transformers==4.57.3, while OmniVoice requires transformers>=5.3.0.
Use a separate venv for OmniVoice:../Local_TTS/.python/python/bin/python3 -m venv .venv-omnivoice
source .venv-omnivoice/bin/activate
python -m pip install --upgrade pip
python -m pip install -r requirements-omnivoice.txt
meituan-longcat/LongCat-AudioDiT project dependencies if the audiodit
package is not importable.vllm serve mistralai/Voxtral-4B-TTS-2603 --omni
The app's Voxtral preset includes --server_url http://127.0.0.1:8000/v1 in
Extra flags.
This app does not download model weights during generation. Before running a preset, make sure its model is already present in the local Hugging Face cache or copy the model into a local folder and use that path in the Model field. Use the Model panel's Check Update button when you intentionally want to check Hugging Face and refresh the selected repo-id model cache. That button is the only app workflow that enables external network access.
Kokoro supports a local folder shaped like this:
models/Kokoro-82M/
config.json
kokoro-v1_0.pth
voices/
af_heart.pt
Then use models/Kokoro-82M as the Model value. Other from_pretrained
backends can use either an existing cache entry or a local model directory.
Voxtral requests are restricted to loopback URLs such as 127.0.0.1 or
localhost; the vLLM server itself must also have its model files locally
available.
./build_macos_app.sh
open "build/OG Local TTS.app"
The app defaults to .venv/bin/python when it exists. If dependencies are
installed in another environment, use the Python field in the app to choose that
interpreter.
python og_tts_gui.py
Both the native app and Python fallback save generated audio under outputs/ by
default.
Kokoro:
python og_tts_runner.py \
--backend kokoro \
--model hexgrad/Kokoro-82M \
--text "Hello from original Kokoro." \
--lang_code a \
--voice af_heart \
--join_audio \
--output_path outputs
Qwen CustomVoice:
python og_tts_runner.py \
--backend qwen \
--model Qwen/Qwen3-TTS-12Hz-0.6B-CustomVoice \
--text "Hello from original Qwen TTS." \
--lang_code English \
--voice Ryan \
--join_audio \
--output_path outputs
OmniVoice voice cloning:
python og_tts_runner.py \
--backend omnivoice \
--model k2-fsa/OmniVoice \
--text "Hello from original OmniVoice." \
--ref_audio sample.wav \
--ref_text "Transcript of the sample." \
--join_audio \
--output_path outputs
mlx-audio, mlx-lm, or MLX
model repos.mlx-community/* model ids.5 commits
Python
52.8%
Swift
44.3%
Shell
2.9%