PHP无法直接合成语音,需调用云TTS API(如阿里云)或本地引擎(如eSpeak),后端生成音频文件并返回路径,前端通过<audio>标签或JS控制播放,同时需注意安全过滤、密钥管理、缓存与并发优化。

PHP本身不能直接合成语音,它只是服务器端脚本语言,不处理音频生成或浏览器播放。实现“文本转语音(TTS)并在网页播放”,需要前后端协作:PHP负责调用TTS服务获取音频文件(或URL),前端用<audio>标签或JavaScript播放。关键在于选择稳定、易集成的TTS方案。
使用免费云TTS接口(如阿里云/百度/腾讯)
国内主流平台都提供免费额度的TTS API,适合中小项目。以阿里云语音合成(Polly风格接口)为例:
- 在阿里云控制台开通“智能语音交互”服务,获取
AccessKey ID和Secret - 用PHP发起HTTPS POST请求,传入文本、音色、语速等参数,返回MP3音频的临时URL或二进制流
- PHP可将返回的音频保存为临时文件(如
cache/tts_12345.mp3),再把路径传给前端 - 前端用
<audio controls src="cache/tts_12345.mp3?r==time()?>"></audio>播放,加时间戳防缓存
调用本地轻量TTS引擎(如eSpeak + PHP exec)
适合对隐私敏感、无外网或需离线运行的场景(如内网系统):
- Linux服务器安装
eSpeak:sudo apt install espeak - PHP中用
exec()调用命令生成WAV:espeak -v zh -w /tmp/output.wav "你好,欢迎访问" - WAV体积大,可用
ffmpeg转成MP3:ffmpeg -i /tmp/output.wav -acodec libmp3lame /tmp/output.mp3 - 确保PHP有执行权限、临时目录可写,且禁用
exec安全限制(disable_functions中移除)
前端播放优化与兼容性处理
光有音频文件还不够,用户交互体验要跟上:
立即学习“PHP免费学习笔记(深入)”;
- 避免页面加载就自动播放(移动端多数浏览器禁止),改用按钮触发:
<button onclick="document.getElementById('tts-audio').play()">听一下</button> - 添加加载状态:点击后显示“正在合成…”,PHP返回成功后再切换为“播放中”
- 捕获播放失败(如404、跨域、格式不支持),提示用户并记录错误日志
- 对长文本做分段合成,单次不超过500字符(多数API限制),前端拼接多个
<audio>或合并后播放
安全与性能注意事项
文本转语音涉及外部请求和文件操作,容易被忽视风险:
- PHP接收的文本必须过滤HTML标签、JS代码,防止XSS或命令注入(尤其用
exec时) - 不要把TTS密钥硬编码在PHP文件里,应放在
/config/外的环境变量或配置中心 - 音频文件建议加随机前缀+过期清理(如24小时后删除),避免磁盘被占满
- 高并发下,可用Redis缓存已合成的相同文本结果,减少重复调用



















