PHP Laravel调用谷歌TTS实现文本转音频时长文本报错如何解决?
问题根因
谷歌翻译公开TTS接口translate_tts使用GET请求传参,对URL总长度有严格限制(通常为2000字符以内),长文本经URL编码后很容易超出阈值,因此会出现短文本正常、长文本报错的情况。
可行解决方案
方案1:长文本分段请求后合并音频(最适配当前场景)
将长文本按语义切割为多段短文本,分别请求TTS接口后拼接音频片段即可,修改后参考代码如下:
$les = $lesson->full_text; /* 文本转音频逻辑 */ $txt = htmlspecialchars($les); // 按句子标点切割文本,避免截断完整语义,每段长度符合接口限制 $segments = preg_split('/(?<=[.!?。!?])\s+/', $txt); $full_audio = ''; // 配置请求上下文,添加UA和超时避免接口拦截、超时报错 $context = stream_context_create([ 'http' => [ 'timeout' => 10, 'header' => 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' ] ]); foreach ($segments as $seg) { $seg = trim($seg); if (empty($seg)) continue; $encoded_seg = rawurlencode($seg); $audio_seg = file_get_contents('https://translate.google.com/translate_tts?ie=UTF-8&client=gtx&q='.$encoded_seg.'&tl=es', false, $context); if ($audio_seg !== false) { $full_audio .= $audio_seg; } } $speech="<audio controls='controls'><source src='data:audio/mpeg;base64,".base64_encode($full_audio)."'></audio>"; echo $speech; exit(); /* 文本转音频逻辑结束 */
普通业务场景下直接拼接音频片段即可正常播放,若对音频流畅度要求高,可使用ffmpeg对拼接后的音频做一次格式标准化,消除段落间的顿挫感。
方案2:替换为官方TTS服务
如果业务对稳定性要求高,可替换为谷歌云官方Text-to-Speech API,支持POST请求传参,单请求最高可支持5000字符的文本输入,不会出现长度限制问题。
额外优化建议
- 可对生成的音频做本地磁盘/Redis缓存,相同文本无需重复请求接口,大幅提升响应速度
- 若需要支持超过1000词的超长篇文本,可在前端实现音频分片加载,避免单次请求等待时间过长
内容的提问来源于stack exchange,提问作者Umer Fayyaz
相关产品推荐
相关产品推荐

