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

运行Google Text-to-Speech API官方PHP代码频繁报错的解决诉求

解决Google Text-to-Speech API多次调用后DNS解析失败的问题

这个问题我之前碰到过好几次,核心是DNS解析临时失效导致Guzzle无法连接到Google的OAuth2服务器,尤其是在连续调用8-10次后容易触发。下面是几个能彻底解决或者缓解这个问题的方案,按优先级排序:

1. 先排查基础网络连通性

首先确认你的机器能稳定解析Google的域名:

  • 执行命令测试DNS解析:nslookup oauth2.googleapis.com,确保能返回有效的IP地址
  • 执行命令测试HTTPS连接:curl -v https://oauth2.googleapis.com/token,确认能正常建立连接

如果这两步有问题,先调整本地DNS服务器(比如换成Google的8.8.8.8或者Cloudflare的1.1.1.1),或者检查防火墙/代理是否限制了对Google服务的访问。

2. 给Guzzle客户端添加重试机制

默认的TextToSpeechClient使用的Guzzle客户端没有配置重试策略,遇到临时DNS错误会直接失败。我们可以手动添加重试中间件,让客户端自动重试这类网络异常:

修改你的客户端初始化代码,添加Guzzle的配置:

use GuzzleHttp\Middleware;
use GuzzleHttp\HandlerStack;

// 创建重试中间件
$stack = HandlerStack::create();
$stack->push(Middleware::retry(function ($retries, $request, $response, $exception) {
    // 仅在遇到网络连接异常(包括DNS解析失败)时重试,最多重试3次
    if ($exception instanceof \GuzzleHttp\Exception\ConnectException && $retries < 3) {
        return true;
    }
    return false;
}));

// 初始化TextToSpeechClient时传入Guzzle配置
$client = new TextToSpeechClient([
    'credentials' => '/Documents/gcp_credentials/config.json',
    'httpHandler' => $stack
]);

这个配置会让客户端在遇到连接异常时自动重试最多3次,大概率能解决临时网络波动导致的问题。

3. 在业务代码中添加手动重试逻辑

除了Guzzle的全局重试,你还可以在调用synthesizeSpeech的地方添加try-catch块,手动捕获异常并重试:

$maxRetries = 3;
$retryCount = 0;
$success = false;

while (!$success && $retryCount < $maxRetries) {
    try {
        $response = $client->synthesizeSpeech($synthesisInputText, $voice, $audioConfig);
        $audioContent = $response->getAudioContent();
        file_put_contents('output.wav', $audioContent);
        $success = true;
        echo "语音合成成功\n";
    } catch (\GuzzleHttp\Exception\ConnectException $e) {
        $retryCount++;
        echo "连接失败,正在重试第{$retryCount}次...\n";
        // 重试前等待1秒,避免频繁请求触发限制
        sleep(1);
    } catch (\Exception $e) {
        // 处理其他异常(比如API配额不足、参数错误等)
        echo "发生其他错误:{$e->getMessage()}\n";
        break;
    }
}

if (!$success) {
    echo "重试{$maxRetries}次后仍失败,请检查网络或API配置\n";
}

4. 调整PHP的DNS缓存设置

PHP默认的DNS缓存时间较短,你可以通过修改配置延长缓存时间,减少重复解析同一个域名的次数:

  • 在php.ini中添加:dns_cache_ttl = 300(缓存5分钟)
  • 或者在代码开头添加:ini_set('dns_cache_ttl', 300);

这能降低DNS解析失败的概率,让连续调用更稳定。


内容的提问来源于stack exchange,提问作者kraneee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:37:47