PHP切换TTS音色需正确设置第三方API的voice(阿里云)、per(百度)、VoiceType(腾讯云)等参数,拼写、参数位置、鉴权及SDK版本均影响生效。

PHP 本身不直接支持语音合成(TTS),所谓“调用听书插件”实际是调用第三方 TTS 服务的 HTTP API(如阿里云语音合成、百度语音、腾讯云 TTS 等),音色切换完全取决于该服务提供的 voice 或 speaker 参数,PHP 只负责构造请求并传参。
确认你用的是哪个 TTS 服务商的 API
不同厂商的参数名、可用音色列表、鉴权方式完全不同,不能混用。常见情况:
- 阿里云智能语音交互(Intelligent Speech Interaction):参数为
voice,值如zhitian_emo、xiaoyun、siyue - 百度语音合成(Text to Speech):参数为
per(person),值如111(度小美)、106(度博文)、112(度小宇) -
腾讯云语音合成(TTS):参数为
VoiceType,值如2001(云希)、2002(云磊)、2004(云扬) -
本地部署的 eSpeak / Piper / Coqui TTS:需通过命令行或 HTTP 封装服务,音色由模型文件决定,参数通常是
model或speaker_id
PHP 中切换音色的关键是正确设置请求参数
以阿里云为例,音色由 voice 字段控制;若你传了 voice=zhiyan 却听到女声,大概率是拼写错误(正确应为 zhiyan 还是 zhiyan_emo?查官方文档)。常见错误:
- 参数名写错:比如把
voice写成voice_id或speaker - 音色 code 不存在:如传
voice=xiaoguang,但阿里云当前不提供该音色 - 未刷新 AccessKey 或 Signature:参数改了但签名没重算,API 返回 403 或默认音色
- 请求体格式错误:JSON 请求中
voice没放在audio对象里(阿里云要求嵌套在config下)
{
"text": "今天天气不错",
"config": {
"voice": "xiaoyun",
"format": "mp3",
"sample_rate": 16000
}
}
如何验证音色是否生效
不要只看 HTTP 状态码 200 —— 它只表示请求被接收,不代表音色已切换。必须:
立即学习“PHP免费学习笔记(深入)”;
- 下载返回的音频文件,本地播放确认人声性别/语调/口音是否符合预期
- 对比不同
voice值生成的音频时长和文件大小(同一文本下,不同音色可能有微小差异) - 查看响应头或响应体中的调试字段(如阿里云返回
X-Voice-Usedheader,腾讯云返回voice_type字段) - 在服务商控制台「语音合成调试」页面手动测试相同参数,排除 PHP 侧编码问题
注意 SDK 版本与音色兼容性
旧版 SDK(如阿里云 aliyun-openapi-php-sdk v1.x)可能不支持新上线的音色(如 2023 年新增的 siyue),即使你在请求里写了也自动降级为默认音色。解决方法:
- 升级到最新版 SDK(如阿里云推荐用
alibabacloud/pop-core+alibabacloud/alisydney-20190729) - 绕过 SDK,手写
curl请求,确保参数透传无损 - 检查服务商文档的「音色列表更新时间」,确认你要用的音色已全量开放
音色不是 PHP 的配置项,它藏在每次请求的 payload 里;漏掉一个下划线、少一个 header、签名过期,都会让切换失效——最稳妥的方式是先用 Postman 调通,再把 working request 复制进 PHP。











