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