Google Speech to Text API Неопределенный метод

Я пытаюсь научиться использовать API Google для преобразования речи в текст, но при запуске кода получаю ошибку неопределенного метода. Код взят из библиотеки облачного клиента Google для использования. Я не уверен, как исправить ошибку. Ошибка: неопределенные альтернативы метода для nil: NilClass (NoMethodError)

#use gem install google-cloud-speech

require "google/cloud/speech"


speech = Google::Cloud::Speech.speech


file_name = "file_path"


audio_file = File.binread file_name


config = { encoding:          :LINEAR16,
       sample_rate_hertz: 16_000,
       language_code:     "en-US" }
audio  = { content: audio_file }


response = speech.recognize config: config, audio: audio

results = response.results

results.first.alternatives.each do |alternatives|
puts "Transcription: #{alternatives.transcript}"
  end

person Nam    schedule 18.10.2020    source источник
comment
Нет первого результата - значит, нет результатов. Это может быть не ошибка; возможно, он просто не смог ничего получить из вашего аудиофайла. Есть ли демонстрационный аудиофайл, который вы можете использовать, и вы знаете, что Google может получить результаты?   -  person Tom Harvey    schedule 18.10.2020
comment
Возможно, вы следовали этой документации (cloud.google.com/speech-to-text/docs/). Вы также использовали предоставленный образец файла? Или вы использовали другой? Я попытался запустить этот код в консоли GCP, но не обнаружил ошибки. Могу ли я узнать, запускали ли вы этот код в другой среде?   -  person Rally H    schedule 20.10.2020
comment
@TomHarvey Я использовал аудиофайл, созданный с помощью API преобразования текста в речь Google, и использовал путь к файлу. Я также попробовал свою собственную запись.   -  person Nam    schedule 21.10.2020
comment
@RallyH Вы просто скопировали и вставили предоставленный код из этой документации и запустили его? Я сделал то же самое, но скопировал его в код vs и запустил с помощью терминала. У меня также был свой собственный файл записи голоса, который я использовал для пути.   -  person Nam    schedule 21.10.2020


Ответы (1)


Я попытался воспроизвести вашу проблему и смог успешно выполнить код и другие примеры из документация. Кроме того, поскольку вы заявили, что изучаете, как использовать Speech to Text API от Google, я опишу шаги, которые я предпринял.

Похоже, вы взяли код из документация. Однако у вас нет первых строк и последних строк кода, которые соответственно определяют метод транскрипции и вызов для его выполнения. По этой причине, когда вы выполняете свой код, нет вызова ни к какому методу, ни к API преобразования речи в текст. Ваш код должен быть следующим:

def speech_sync_recognize audio_file_path: nil
  # [START speech_transcribe_sync]
  # audio_file_path = "Path to file on which to perform speech recognition"

  require "google/cloud/speech"

  speech = Google::Cloud::Speech.speech

  # [START speech_ruby_migration_sync_response]
  audio_file = File.binread audio_file_path
  config     = { encoding:          :LINEAR16,
                 sample_rate_hertz: 16_000,
                 language_code:     "en-US" }
  audio      = { content: audio_file }

  response = speech.recognize config: config, audio: audio

  results = response.results

  alternatives = results.first.alternatives
  alternatives.each do |alternative|
    puts "Transcription: #{alternative.transcript}"
  end
  # [END speech_ruby_migration_sync_response]
  # [END speech_transcribe_sync]
end

if $PROGRAM_NAME == __FILE__
  command = ARGV.shift

#I have added this part in order to use a command after to define which method to call within the code.
  case command
  when "recognize"
    speech_sync_recognize audio_file_path: ARGV.first

  end
end

И для того, чтобы запустить образец,

bundle exec ruby speech_samples.rb

Обратите внимание на аргумент recognize, который описывает, какой метод выполнять из кода. В приведенном выше случае есть только один. Однако использование аргументов в вызове очень полезно, когда в коде доступны другие методы для вызова.

Кроме того, я опишу шаги, которые я предпринял для правильного выполнения кода. Я выполнил шаги, описанные здесь,

  1. Я запустил код из Cloud Shell. Однако speech.googleapis.com не поддерживает аутентификацию конечных пользователей из Cloud Shell. По этой причине я предоставил Service Account Token Creator из консоли IAM своему пользователю, чтобы я мог выдавать себя за службу Учетная запись и вызов API.

  2. Экспортируйте project_id в переменную среды, например export GOOGLE_CLOUD_PROJECT="YOUR-PROJECT-ID".

  3. Загрузите файл Gemfile. из документации и выполните команду: bundle install

  4. Скопируйте код speech_samples.rb в вашу среду.

  5. Скопируйте путь к файлу в переменную audio_file_path и раскомментируйте его. Обратите внимание, что будет много audio_file_path локальных переменных, каждая для определенного метода. В моем случае я скопировал путь только к переменной в первой функции audio_file_path = "home/alex/audio.wav".

  6. Обратите внимание, что каждая функция имеет определенный сконфигурированный аргумент (начиная со строки 437). В моем случае я хотел использовать recognize.

  7. Запустите пример кода с помощью bundle exec ruby speech_samples.rb recognize.

  8. Проверьте свою среду на наличие нового каталога с именем results. Затем осмотрите выходы.

  9. Пожалуйста, не забудьте скопировать путь к файлу для всех функций, которые вы будете вызывать, с соответствующими аргументами.

ОБНОВЛЕНИЕ:

Как я упоминал в разделе комментариев, код, которым я поделился выше, является частью файла speech_samples.rb, который содержит различные примеры функций, вызывающих Speech-To-Text API. В моем случае я просто использовал часть образца, который я вставил выше.

Что касается ссылки, которой вы поделились, есть кнопка для исходного репозитория GitHub для кода, такая же, как и в примере, который я использовал. Обратите внимание, что ваш код в GitHub,здесь он заключен в функцию. Кроме того, эта функция должна быть вызвана для выполнения, вы можете вызвать ее, просто написав ее имя после определения функции. Таким образом, код должен выглядеть следующим образом:

def quickstart
  # [START speech_quickstart]
  # Imports the Google Cloud client library
  # [START speech_ruby_migration_import]
  require "google/cloud/speech"
  # [END speech_ruby_migration_import]

  # Instantiates a client
  # [START speech_ruby_migration_client]
  speech = Google::Cloud::Speech.speech
  # [END speech_ruby_migration_client]

  # The name of the audio file to transcribe
  file_name = "./resources/brooklyn_bridge.raw"

  # [START speech_ruby_migration_sync_request]
  # [START speech_ruby_migration_config]
  # The raw audio
  audio_file = File.binread file_name

  # The audio file's encoding and sample rate
  config = { encoding:          :LINEAR16,
             sample_rate_hertz: 16_000,
             language_code:     "en-US" }
  audio  = { content: audio_file }

  # Detects speech in the audio file
  response = speech.recognize config: config, audio: audio
  # [END speech_ruby_migration_config]

  results = response.results
  # [END speech_ruby_migration_sync_request]

  # Get first result because we only processed a single audio file
  # Each result represents a consecutive portion of the audio
  results.first.alternatives.each do |alternatives|
    puts "Transcription: #{alternatives.transcript}"
  end
  # [END speech_quickstart]
end
#call the function defined above
quickstart

ПРИМЕЧАНИЕ. Должен отметить, что я также смог выполнить код из вашего вопроса, не оборачивая его в функцию. Я выполнил шаги, описанные в документации, и успешно получил выходные данные. .

person Alexandre Moraes    schedule 20.10.2020
comment
Я взял код из здесь. Я думал, что мог бы просто использовать код, который был предоставлен, так как он работал с версией преобразования текста в речь. Почему необходимо использовать более 400 строк кода в предоставленном вами образце вместо того, который был в ссылке, по которой я его получил? Я не видел этого при поиске в руководствах по быстрому запуску от Google, поэтому я подумал, что приведенный пример кода был в порядке. Спасибо! - person Nam; 21.10.2020
comment
@Nam, тебе не нужно использовать код из 400+ строк. В этом коде вы можете использовать любую его часть, так как я только что использовал ту часть, которую скопировал в ответе. Кроме того, код в ссылке, которой вы поделились, переходит к тому же репозиторию GitHub, когда вы нажимаете «Просмотр» на GitHub. Затем вы можете проверить, что код заключен в функцию, и после определения функции он должен быть вызван для выполнения. - person Alexandre Moraes; 21.10.2020
comment
Однако я смог использовать код из GitHub, а также из ссылки, которой вы поделились (без включения ее в функцию). Пожалуйста, убедитесь, что вы выполнили все шаги, описанные в документации. Кроме того, какую команду вы используете для выполнения кода? Я обновил ответ кодом из GitHub, можете ли вы попробовать его и сказать мне, сработало ли это? - person Alexandre Moraes; 21.10.2020
comment
@Nam, пожалуйста, примите и проголосуйте за ответ, если вы нашли информацию полезной. - person Alexandre Moraes; 23.10.2020