oMLX 语音回复
使用技能目录中的 scripts/speak.py 调用本机 POST /v1/audio/speech,返回 WAV。仅需 Python 3 标准库和已运行的 oMLX,不另建服务。
- 默认模型:
Qwen3-TTS-12Hz-0.6B-CustomVoice-4bit;默认音色:vivian。 - 当前已确认音色:
vivian、serena、uncle_fu、dylan、eric、ryan、aiden、ono_anna、sohee。可用--voice切换。 - 从
${OMLX_BASE_PATH:-~/.omlx}/settings.json读取端口和 API 密钥;只向127.0.0.1发请求。不要展示或复制密钥到命令、产物或日志。 - 用户给出朗读原文时保留原意和内容;要求语音回答问题时先组织适合听的回答,再合成。不要把 Markdown 标记、无关代码或内部执行日志读出来。
- 只有用户要求语音输出,或对当前对话设定持续语音回复偏好时,才生成语音;不擅自把普通文字回复改成音频。
日常语音使用 --play,不传 --output:音频存入系统临时目录,播放成功后连同该次临时目录自动删除。<skill-dir> 指本 SKILL.md 所在目录:
python3 <skill-dir>/scripts/speak.py \
--voice vivian --play --text '你好,这是语音回复。'
长文本可以通过标准输入传入;若创建临时文本文件,用后删除。用 --language 指定语言,默认 Chinese。--model 仅用于用户选择的其他兼容 TTS 模型,不自动下载或替换模型。
只有用户明确要求保存或下载音频时才传 --output /absolute/path/to/outputs/语音回复.wav,使用当前任务允许的交付目录及唯一文件名。显式输出文件不会自动删除,可与 --play 同用。
用户要求“读给我听”“说给我听”或语音回答时使用 --play,通过 macOS 自带的 /usr/bin/afplay 从当前输出设备播放,并等待播放进程结束。用户仅要音频文件或明确要求不播放时省略该选项。不修改系统音量或输出设备。
在沙盒内遇到 AudioQueueStart failed (-66680) 时,可能是音频设备访问受限;可通过执行工具的正常权限流程,在沙盒外对已经生成的文件运行 /usr/bin/afplay /absolute/path/to/audio.wav 一次。不要重新生成音频或绕过审批。以这次播放进程的退出状态报告结果。若原脚本输出 temporary: true,这次播放成功后删除该音频及其所在的本次 omlx-tts-* 临时目录;不删除显式保存的文件。最终仍无法播放时保留该临时文件供重试,向用户说明路径和未清理状态,不静默留下文件。
临时语音播放成功并删除后,只给简短文字回复,不嵌入已删除文件的播放器。显式保存的音频才根据绝对路径嵌入 。只有收到 playback_completed: true(或已确认外部 afplay 成功退出)才能报告播放命令完成,这不能证明用户实际听到了声音。不声称接入实时通话,也不未经试听评价音质。
连接失败时说明 oMLX 服务不可达;模型缺失或加载失败时报告实际错误,不把下载成功当作推理成功。不自动重启服务、修改配置或循环重试。脚本不覆盖已有输出文件。
CustomVoice 使用预设音色,不能借此实现参考录音克隆。自然语言音色设计、克隆及情绪控制不属于此技能已验证能力。