You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 23:09:00