使用Cloud Speech-To-Text通过cURL调用API遇404错误求助
问题原因排查与修复方案
你的操作脚本中存在两个核心错误,直接导致了404 NOT_FOUND错误:
1. 错误的API认证方式
你在cURL请求中直接将服务账号密钥文件里的private_key作为Bearer Token使用,这完全不符合Google Cloud API的认证规则。Google要求的Bearer Token是通过服务账号密钥生成的短期访问令牌,而非原始私钥本身。
错误代码片段:
-H "Authorization: Bearer $(cat $GOOGLE_APPLICATION_CREDENTIALS | jq -r .private_key)"
修复方案:
使用gcloud命令生成合法的访问令牌,和官方教程保持一致即可:
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)"
(注:你已经设置了GOOGLE_APPLICATION_CREDENTIALS环境变量,该命令会自动基于此密钥生成有效令牌)
2. 请求JSON中的变量未被解析
你用单引号包裹了整个JSON请求内容,导致Shell无法解析其中的${PROJECT_ID}变量,最终生成的sync-request.json里的音频URI是字面量gs://${PROJECT_ID}_bucket/brooklyn.flac,而非实际的存储桶路径,这会让Speech-to-Text API找不到目标音频文件。
错误代码片段:
echo '{ "config": { "encoding":"FLAC", "sampleRateHertz": 16000, "languageCode": "en-US", "enableWordTimeOffsets": false }, "audio": { "uri":"gs://${PROJECT_ID}_bucket/brooklyn.flac" } }' > sync-request.json
修复方案:
改用双引号包裹JSON内容(注意转义内部的双引号),或者使用here-doc语法让Shell解析变量:
cat > sync-request.json << EOF { "config": { "encoding":"FLAC", "sampleRateHertz": 16000, "languageCode": "en-US", "enableWordTimeOffsets": false }, "audio": { "uri":"gs://${PROJECT_ID}_bucket/brooklyn.flac" } } EOF
额外优化建议
- 你给音频文件设置了
AllUsers的读权限,其实只要服务账号拥有存储桶的roles/storage.objectViewer权限即可完成API调用,无需公开文件,这样更安全。 - 给服务账号授予
roles/owner权限过于宽泛,建议遵循最小权限原则,仅授予roles/speech.client和roles/storage.objectViewer权限。
内容的提问来源于stack exchange,提问作者M. D.
相关产品推荐
相关产品推荐

