如何在Heroku平台上调用Google TextToSpeech API?
在Heroku上调用Google TextToSpeech API的解决方案
别担心,我有几个实用的方案帮你搞定这个问题,不用在Heroku上装Google Cloud SDK也能顺利调用API:
方案一:手动生成访问令牌(纯REST调用,无需依赖SDK)
你之前用的gcloud命令本质是靠服务账号密钥生成临时访问令牌,咱们完全可以自己用代码实现这个逻辑,绕开gcloud工具的依赖。
具体步骤:
- 配置Heroku环境变量:把你的服务账号JSON内容直接粘贴到Heroku的
GOOGLE_CLOUD_KEYFILE_JSON环境变量里(这步你已经熟啦)。 - 编写Ruby代码生成JWT并获取令牌:
先给Gemfile加两个依赖:
然后用这段代码生成访问令牌:gem 'jwt' gem 'httparty'require 'jwt' require 'httparty' require 'json' def get_google_access_token keyfile = JSON.parse(ENV['GOOGLE_CLOUD_KEYFILE_JSON']) private_key = OpenSSL::PKey::RSA.new(keyfile['private_key']) payload = { iss: keyfile['client_email'], scope: 'https://www.googleapis.com/auth/cloud-platform', aud: 'https://oauth2.googleapis.com/token', exp: Time.now.to_i + 3600, # 令牌1小时内有效 iat: Time.now.to_i } jwt = JWT.encode(payload, private_key, 'RS256') response = HTTParty.post( 'https://oauth2.googleapis.com/token', body: { grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer', assertion: jwt } ) response.parsed_response['access_token'] end - 调用TextToSpeech API:
拿到令牌后,就可以像curl那样发送请求了:def synthesize_speech(text) access_token = get_google_access_token url = 'https://texttospeech.googleapis.com/v1beta1/text:synthesize' payload = { input: { text: text }, voice: { languageCode: 'en-gb', name: 'en-GB-Standard-A', ssmlGender: 'FEMALE' }, audioConfig: { audioEncoding: 'MP3' } } response = HTTParty.post( url, headers: { 'Authorization' => "Bearer #{access_token}", 'Content-Type' => 'application/json' }, body: payload.to_json ) # 返回base64编码的MP3内容,你可以保存到文件或返回给前端 response.parsed_response['audioContent'] end
方案二:使用官方Ruby客户端库(更简洁省心)
你之前接触的旧版本客户端库可能没包含TextToSpeech,但现在Google已经出了单独的google-cloud-texttospeech gem,完全支持这个API,而且认证逻辑会自动处理,不用自己折腾令牌。
具体步骤:
- 添加Gem到项目:
在Gemfile里加入:
运行gem 'google-cloud-texttospeech'bundle install后,把Gemfile和Gemfile.lock提交到Git,部署到Heroku。 - 配置环境变量:
同样把服务账号JSON内容设置到Heroku的GOOGLE_CLOUD_KEYFILE_JSON环境变量,客户端库会自动读取完成认证。 - 编写调用代码:
用官方库的代码比手动调REST简单太多:require "google/cloud/text_to_speech" def synthesize_speech(text) # 初始化客户端 client = Google::Cloud::TextToSpeech.text_to_speech # 设置输入文本 input = Google::Cloud::TextToSpeech::SynthesisInput.new(text: text) # 配置语音参数 voice = Google::Cloud::TextToSpeech::VoiceSelectionParams.new( language_code: "en-GB", name: "en-GB-Standard-A", ssml_gender: "FEMALE" ) # 配置音频输出格式 audio_config = Google::Cloud::TextToSpeech::AudioConfig.new( audio_encoding: "MP3" ) # 调用合成接口 response = client.synthesize_speech( input: input, voice: voice, audio_config: audio_config ) # 获取base64编码的音频内容 response.audio_content end
方案三:(可选)给Heroku装Google Cloud SDK
如果实在想用curl命令的方式,可以通过Heroku的buildpack安装gcloud SDK,但这个方案会增加应用部署体积,不如前两个优雅。简单提一下步骤:
- 给Heroku应用添加Google Cloud Buildpack:
heroku buildpacks:add https://github.com/heroku/heroku-buildpack-google-cloud.git - 配置好
GOOGLE_CLOUD_KEYFILE_JSON环境变量后,gcloud命令就能在Heroku上正常运行了。
个人最推荐方案二,官方库更稳定,维护起来省心,认证逻辑完全不用自己写,踩坑概率低很多。
内容的提问来源于stack exchange,提问作者Jonah
相关产品推荐
相关产品推荐

