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

如何在Heroku平台上调用Google TextToSpeech API?

在Heroku上调用Google TextToSpeech API的解决方案

别担心,我有几个实用的方案帮你搞定这个问题,不用在Heroku上装Google Cloud SDK也能顺利调用API:

方案一:手动生成访问令牌(纯REST调用,无需依赖SDK)

你之前用的gcloud命令本质是靠服务账号密钥生成临时访问令牌,咱们完全可以自己用代码实现这个逻辑,绕开gcloud工具的依赖。

具体步骤:

  1. 配置Heroku环境变量:把你的服务账号JSON内容直接粘贴到Heroku的GOOGLE_CLOUD_KEYFILE_JSON环境变量里(这步你已经熟啦)。
  2. 编写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
    
  3. 调用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,而且认证逻辑会自动处理,不用自己折腾令牌。

具体步骤:

  1. 添加Gem到项目:
    在Gemfile里加入:
    gem 'google-cloud-texttospeech'
    
    运行bundle install后,把Gemfile和Gemfile.lock提交到Git,部署到Heroku。
  2. 配置环境变量:
    同样把服务账号JSON内容设置到Heroku的GOOGLE_CLOUD_KEYFILE_JSON环境变量,客户端库会自动读取完成认证。
  3. 编写调用代码:
    用官方库的代码比手动调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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:07:13