| name | omnivoice-tts |
| description | Generate local text-to-speech audio with Jay's installed OmniVoice CLI. Use when Codex needs to create Chinese or multilingual speech, voiceover WAV files, short narration clips, test TTS output, or stable voice-cloned audio from a reference recording using `/Users/maxazure/jayhome/projects/OmniVoice`. |
OmniVoice TTS
Use Jay's local OmniVoice install to generate WAV speech from text. The installed project is:
/Users/maxazure/jayhome/projects/OmniVoice
The preferred wrapper is:
scripts/omnivoice_tts.py
Quick Start
Generate a Chinese WAV with the default male Mandarin-style voice:
python3 /Users/maxazure/.codex/skills/omnivoice-tts/scripts/omnivoice_tts.py \
--text "你好,Jay,这是用 OmniVoice 生成的一段中文语音。"
The script prints the output path. By default, files are saved under:
/Users/maxazure/jayhome/projects/OmniVoice/outputs/
Default Settings
Use these defaults unless the user asks otherwise:
language: Chinese
instruct: 男,中音调
num_step: 16
class_temperature: 0
position_temperature: 0
- output format: WAV, 24 kHz mono
For a faster rough preview, pass --num-step 8.
Voice Consistency
For consistent voice across multiple generations, prefer voice cloning:
python3 /Users/maxazure/.codex/skills/omnivoice-tts/scripts/omnivoice_tts.py \
--text "这里是要生成的新文本。" \
--ref-audio /path/to/reference.wav \
--ref-text "这里写参考音频中实际说的话。" \
--output /path/to/output.wav
Keep the same ref-audio, ref-text, language, instruct, num-step, speed or duration, and temperatures for every segment. Avoid Auto Voice when the user asks for a consistent speaker.
Reference audio guidance:
- Use 3-10 seconds of clean speech.
- Use the same language as the target text when possible.
- Provide accurate
ref-text; omitting it makes stability worse because ASR must infer it.
- Do not clone a real person's voice unless the user has rights or consent.
Longer Scripts
For paragraphs or article narration:
- Generate one paragraph at a time if the user needs easier review or editing.
- Use the same reference audio and settings for all segments.
- Name files in reading order, such as
part_001.wav, part_002.wav.
- If exact duration matters, pass
--duration and --postprocess-output false.
Validation
After generation, verify the file exists and has audio:
ffprobe -v error -show_entries stream=sample_rate,channels,duration \
-of default=nw=1 /path/to/output.wav
For a quick waveform sanity check:
python3 - <<'PY'
import soundfile as sf, numpy as np
x, sr = sf.read("/path/to/output.wav")
print("sr", sr, "samples", len(x), "duration", len(x) / sr, "peak", float(np.max(np.abs(x))))
PY