Sign in

Зарегистрируйтесь, чтобы стать полноправным участником сообщества Masterpro.ws.

Google Cloud Text to Speech onRails Pro. Перезагрузка

Опубликовал новую версию Text-to-Speech onRails, получившую (и не без некоторого основания) приставку Pro.

Данный rails-app позволяет, помимо конвертации текста в звук посредством использования Google Cloud Text to Speech API, ряд иных полезностей... а именно: возможность присвоить каждому звуковому файлу произвольное название, также загрузить (при желании) в хранилище Amazon ES3 либо иное совместимое (Google Cloud Storage, Microsoft Azure Storage), также поддерживается языковой перевод налету средствами Google Cloud Translate API. На данный момент это весь перечень функций; возможно, в дальнейшем что-то добавится.

 

Увидеть на гитхабе.

 

Google Cloud Text to Speech onRails Pro. Перезагрузка
Google Cloud Text to Speech onRails Pro. Перезагрузка

 

За основу взят Ruby on Rails 6, веб-интерфейс приложения сверстан на основе Bootstrap 5, использован Webpacker, ruby-обертка вокруг webpack. Разумеется, jQuery, эффектные Ajax Flash Messages, etc. Как и в старом приложении, реализована поддержка восемнадцати языков, понимает SSML, а на выходе - альтернатива из трех возможных форматов: MP3 (MPEG Audio Layer III), WAV (LINEAR16) и OGG (OGG_OPUS). Излишне говорить, что функцию использования удаленного хранилища обеспечивает Active Storage.

 

Google Cloud Text to Speech onRails Pro. Перезагрузка
Google Cloud Text to Speech onRails Pro. Перезагрузка

 

Собсно, приложение давно и вполне успешно пиарится на Yotube и гитхабе, добавить в этом контексте особо нечего. Поэтому всего только остановлюсь здесь на паре-тройке технических моментов, не более.

Как получить в консоли Google файл GOOGLE_APPLICATION_CREDENTIALS, разрешающий доступ к двум и более API?

Гугля аналоги, обнаружил странное: у разработчиков, оказывается, сплошь и рядом вызывает трудности получение в консоли Google JSON-файла, открывающего доступ не к одному, а к двум и более API. В ход идут попытки разнообразных ухищрений, во избежание которых сходу следующая ремарка: в системе вашего приложения возможна (ну, во всяком случае, целесообразна) лишь одна переменная окружения GOOGLE_APPLICATION_CREDENTIALS (Application Default Credentials (ADC) support one and only one service account JSON key file specified by the environment variable GOOGLE_APPLICATION_CREDENTIALS); попытки любых итераций в этом плане, имхо, моветон. Все, на самом деле, не просто, а очень просто: после создания первого акка, оставаясь в том же проекте - находим в библиотеках (library) второй API, определяя для него ту же самую роль, что была ранее создана для первого, и получаем ключ, который и есть искомый. Все.

Использовать агрегатор RapidAPI или работать напрямую с Google?

Вопрос неоднозначный. С одной стороны, через RapidAPI, возможно, удобнее (впрочем, субъективно). С другой стороны - имхо, это дороже, и нет вкусных плюшек Google... впрочем, здесь все тоже очень субъективно. В итоге пришел к тому, что работа без посредников априори более оптимальна (опыт, сын ошибок трудных убедил меня, что так не только при построении запросов к API), и первый вариант кода закомментировал. Тем не менее, покажу и то и другое:

 

# Use Google Cloud Translate API across RapidAPI (REST):

def translate
  body = {
    q: params[:request], # translatable text
    target: params[:lang] #=> 'en'
  }

  translation = api_request(
    'language/translate/v2',
    method: :post,
    body: URI.encode_www_form(body)
  )

  translation['data']['translations'].first['translatedText']
end

def api_request(path, method: :get, body: nil)
  params = {
    headers: {
      'x-rapidapi-key': ENV['RAPIDAPI_KEY'],
      'content-type': 'application/x-www-form-urlencoded'
    }
  }

  params[:body] = body if body
  # use gem 'excon'
  response = Excon.send(
    method,
    "https://google-translate1.p.rapidapi.com/#{path}",
    params
  )

  JSON.parse(response.body)
end

 

 

# To Google Cloud Translate API directly (use gem 'google-cloud-text_to_speech')
def translate
  api_request(params).to_s
end

def api_request(params)
  translate = Google::Cloud::Translate::V2.new project_id: ENV['CLOUD_PROJECT_ID']
  translate.translate params[:request], to: params[:lang] #=> 'en'
end

 

В обоих случаях двухбуквенный код ISO в качестве стринга source_language я, как видите, не указываю вообще, Google вполне корректно определит его самостоятельно. Только params[:lang] как target перевода, идентификатор проекта и сам текст. Обращение напрямую к Google Cloud Translate API реализует в этом случае gem 'google-cloud-text_to_speech', соответственно:

 

# application.rb
require "google/cloud/translate/v2"

 

Разумеется, как и было сказано, вам потребуется:

 

GOOGLE_APPLICATION_CREDENTIALS: "key.json"

 

Бросьте файл в корень приложения (или в config), пропишите актуальный путь в application.yml, сгенерированный gem 'figaro':

 

$ bundle exec figaro install

 

Запустите эту команду сразу после того, как клонируете проект, либо же, если пушите приложение на Heroku, в этом нет необходимости; попросту пропишите переменные окружения в 'Settings' -> 'Reveal Config Vars' панели управления. Также в помощь англоязычная версия step by step руководства по разворачиванию приложения... я больше чем уверен, все у вас получится. 

cool

Оставить комментарий

Добавьте ваш комментарий

Комментарии в блоге