PHP调用Google Text-to-Speech API凭证及IAM权限问题求助
问题根因
Could not load the default credentials 报错的直接原因是你初始化TextToSpeechClient时,没有传入任何认证配置。你前面单独实例化Google\Client做的认证配置,根本没有绑定到TTS客户端实例上,TTS客户端启动时会自动从环境变量、系统默认路径查找凭证,找不到就直接抛错。
另外你注释里写的OAuth授权码跳转逻辑,是给需要获取用户私人资源授权的场景(比如访问用户个人Drive文件)用的,调用Text-to-Speech这类公共云服务API完全不需要走这套流程。
解决方案
方案1:API密钥认证(优先匹配你的需求)
注意:Google Cloud PHP客户端默认的gRPC传输通道不支持API密钥认证,必须显式指定REST传输方式才能正常用API密钥调用,操作步骤:
- 先到Google Cloud控制台确认你生成的API密钥已经开通Text-to-Speech API的访问权限,没有设置严格的IP/应用限制拦截本地请求
- 直接在初始化TTS客户端时传入API密钥和传输配置,不需要单独初始化
Google\Client,代码参考:
require __DIR__ . '/vendor/autoload.php'; use Google\Cloud\TextToSpeech\V1\AudioConfig; use Google\Cloud\TextToSpeech\V1\AudioEncoding; use Google\Cloud\TextToSpeech\V1\SynthesisInput; use Google\Cloud\TextToSpeech\V1\TextToSpeechClient; use Google\Cloud\TextToSpeech\V1\VoiceSelectionParams; // 初始化时直接传入认证配置 $textToSpeechClient = new TextToSpeechClient([ 'key' => '替换为你自己的API密钥', 'transport' => 'rest' // 必须指定REST传输,否则API密钥认证不生效 ]); // 后续正常编写语音合成逻辑即可,参考示例: // $input = (new SynthesisInput())->setText('测试语音合成内容'); // $voice = (new VoiceSelectionParams()) // ->setLanguageCode('cmn-CN') // ->setName('cmn-CN-Standard-A'); // $audioConfig = (new AudioConfig())->setAudioEncoding(AudioEncoding::MP3); // $response = $textToSpeechClient->synthesizeSpeech($input, $voice, $audioConfig); // file_put_contents('output.mp3', $response->getAudioContent()); // $textToSpeechClient->close();
方案2:服务账号JSON凭证认证
如果需要用性能更好的gRPC传输,推荐用服务账号凭证认证,注意你当前的googleAuthorization.json如果是OAuth2客户端ID凭证是不能用的——这类凭证是给用户授权流程用的,不能作为服务端调用云API的凭证,需要重新生成服务账号密钥:
- 进入Google Cloud控制台「IAM与管理-服务账号」页面,新建服务账号,给该账号分配
Cloud Text-to-Speech API User角色,然后为这个服务账号生成JSON格式的密钥,下载后替换你本地原有的凭证文件 - 初始化TTS客户端时显式传入凭证路径即可,代码参考:
require __DIR__ . '/vendor/autoload.php'; use Google\Cloud\TextToSpeech\V1\AudioConfig; use Google\Cloud\TextToSpeech\V1\AudioEncoding; use Google\Cloud\TextToSpeech\V1\SynthesisInput; use Google\Cloud\TextToSpeech\V1\TextToSpeechClient; use Google\Cloud\TextToSpeech\V1\VoiceSelectionParams; $textToSpeechClient = new TextToSpeechClient([ 'credentials' => __DIR__ . '/googleAuthorization.json' // 建议用正斜杠写路径,避免Windows下反斜杠转义导致的路径识别问题 ]); // 后续语音合成逻辑和方案1示例一致
付费技术支持IAM报错说明
这个报错是因为你当前使用的账号,在对应项目所属的组织下没有Support Account Administrator角色。如果是你个人创建的未绑定组织的云项目,直接进入项目IAM页面,给你当前使用的账号绑定该角色即可;如果是公司/他人创建的组织下的项目,你没有权限自行修改IAM配置,需要找组织的超级管理员给你分配对应角色才能继续申请付费支持。
内容的提问来源于stack exchange,提问作者Dennis H
相关产品推荐
相关产品推荐

