Google speech api v2 для чайников

Привет. Сегодня я хочу рассказать об отличной вещи для разработчиков, распознавание речи силами Google. Ни для кого не секрет, что телефоны на базе Android умеют искать в Google то, что вы им надиктовали, и распознает это весьма успешно. Многие этим пользовались, реверсили запросы и использовали в своих проектах. Увы, где-то весной 2014го это закончилось, Google прикрыли доступ к первой версии своего API, изменили формат запроса и добавили аутентификацию для них.

Сейчас это вполне себе легальная функция для разработчиков, вполне документированная, но не без сложностей. Первую версию API застать мне не случилось, а вот вторую попросили коллеги помочь разобрать, ибо надо было что-то делать. К концу дня стало понятно, что не все подробно описано в рунете (да и в англоязычном тоже). Так что давайте по порядку.

UPD 07.01.2016:
Теперь Google Speech API не поддерживает стерео файлы формата Flac (про wav не уверена), только моно. Для записи тестового файла поспользуйтесь Audacity, внизу слева необходимо выбрать частоту 44100, справа сверху режим «Mono». При экспорте файла в формате Flac на всякий случай выберите уровень сжатия 0. Таким образом, статья все еще актуальна на эту дату.
В качестве бонуса работающий API-key AIzaSyCPYK77NqpUfWoHof_HlhnKaGZAsaMT02Q, но заведите лучше свой, интерфейс там немного поменялся,сейчас пункт называется API Manager, там в поиске надо найти Speech API, enable его, и завести в Credentials new API Key.
(for non-russian speakers: google speech api doesn’t support flac stereo files, so previous examples doesn’t works now, please, record your own test files via Audacity, use Mono recording channel, this option in top right conner of application, then use python file, which is at the bottom of this article, thanks)
/UPD

1. Надо обязательно зайти сюда и почитать о формате входных данных, выходных данных, используемых кодеков, а так же скачать примеры аудио-записей для тестов. После чего проверить (при наличии микрофона) https://www.google.com/intl/en/chrome/demos/speech.html , как это будет распознаваться в итоге и подходит ли под ваши задачи.

2. Если все понятно, то, в случае, если вам повезло иметь *nix-подобную систему под рукой, то можно тут же проверить при помощи Curl (пример есть по ссылке выше, API-key для тестов можно использовать AIzaSyAqk7vE0vQDR3JItUPgFp6bcPqgJz8h8tI, работал на август 2014, имейте совесть, заведите свой ключ для продакшена). Если вам не повезло, и под рукой есть только винда, то проверить можно Python скрипта, который опубликован в конце, или любым другим удобным для вас способом написания Post-запросов.

3. Если слова post-запрос и API-key вас не испугали — то вы с абсолютной уверенностью сможете прикрутить распознавание голоса от Google к любой вещи (хоть к чайнику, хоть к умному дому).
Получить API ключ довольно просто (хотя и не тривиально). Необходимо залогиниться под своей учетной записью, зайти на консоль разработчиков, создать новый проект. Перейти слева в раздел APIs и попытаться найти там Speech API. Когда вы его там в списке не нашли, заходим в группу Chromium Dev, вступаем в нее. Снова обновляем страничку APIs, видимо, что Speech API там появился. Радостно включаем его. Google говорит нам, что у нас есть 50 запросов в сутки, но мы ему не верим, ибо это не правда. Скорее всего после релиза бесплатно будет доступно 50-500 запросов, остальное за деньги. А пока можно наслаждаться халявой (подсказывают в тырнетах что 500 запросов в день).
API-key создается в Creditionals -> Create new Key -> Server key -> Create. Все. Ключ готов.

4. Переходим к данным. Оказалось, что это тоже не так просто. Сервер запросто вернет пустой запрос, если язык не тот, или rate в заголовке неверный. Для создания валидных аудио-файлов рекомендовалось использовать Audicity, для формата выходных файлов обязательно flac. Опыт показал, что сколько не бейся, wav работает заметно хуже. Проще конвертировать (или записывать изначально) в flac. Через Audicity просто записываем свой голос, нажимаем файл — экспортировать, выбираем Flac — и готово.
Теперь надо проверить частоту (rate) с которой был записан файл, по умолчанию это 44100, указано в левом нижнем углу приложения Audicity.

5. Для распознавания первого в вашей жизни файла все готово. Теперь нужно в заголовке указать Content-Type: audio/x-flac; rate=44100; где rate это число, которое мы узнали в Audicity, и запустить post-запрос. В результате вернется что-то похожее на

{
"result":[
{
"alternative":[
{
"transcript":"this is a test",
"confidence":0.97321892
},
{
"transcript":"this is a test for"
}
],
"final":true
}
],
"result_index":0
}

6. Завершением всего этого станет нюанс, что при распознавании вторая версия API почему-то возвращает два результата, первый из которых пустой:
{"result":[]}. Не пугайтесь, типа так и надо. Причину не знаю, не описано.

7.

Обещанный кусок кода на Python для тестирования:

#!/usr/local/bin/python
 
import urllib2
import sys
 
key = "AIzaSyAqk7vE0vQDR3JItUPgFp6bcPqgJz8h8tI"
url = "https://www.google.com/speech-api/v2/recognize?output=json&lang=ru-ru&key="+key
try:
   filename = sys.argv[1]
except IndexError:
    print 'Usage: democode.py <file>'
    sys.exit(1)
 
audio = open(filename,'rb').read()
 
headers={'Content-Type': 'audio/x-flac; rate=44100'}
 
request = urllib2.Request(url, data=audio, headers=headers)
response = urllib2.urlopen(request)
print response.read()

p.s. В основном мы бились с тем, что wav файлы пережевывать он не хотел, а в flac у нас был другой rate, при экспорте из телефонии у нас получался 8000.
Удачного распознавания!

21 thoughts on “Google speech api v2 для чайников

  1. Чтобы я не делал, но так и получаю только первый пустой {«result»:[]} ответ. Второго с данными не вижу. Пробовал скачивать примеры звуковых файлов. Тоже самое. Гугл запросы считает, это видно. Подскажите куда копать. Пробовал и ru и en, wav и flac. Но всегда пустой ответ.

  2. https://github.com/gillesdemey/google-speech-v2

    из этих примеров, только один вышел нормально
    democode.py good-morning-google.flac
    {"result":[]}
    {"result":[{"alternative":[{"transcript":"good morning Google how are you feelin
    g today","confidence":0.987629},{"transcript":"morning Google how are you feelin
    g today"},{"transcript":"good morning Google how are you feeling today I"},{"tra
    nscript":"morning Google how are you feeling today I"}],"final":true}],"result_i
    ndex":0}

    И очень точное ваше замечание. Сервер запросто вернет пустой запрос, если язык не тот, или rate в заголовке неверный.

    1. У меня тоже не работает, выдает {«result»:[]} и все. Куда копать и как исправить?

      1. На март 2016 работает шикарно. Внимательно смотрите в заголовках на язык и частоту. Долго возвращал пустой result,пока не поправил частоту на ту,которая и есть в файле.

  3. Спасибо за статью, в своё время вы очень помогли 🙂 Сейчас мне снова понадобилось написать реализацию, и возникает вопрос: любая информация о формате принимаемых и выдаваемых этим API данных берётся из реверс-инжиниринга? То есть, официальной документации в принципе не существует?

    1. К сожалению, да. Нет никаких оправданий гуглу за такие вещи, но у него часто такое бывает. Работает-работает, а потом без объявления войны и документации что-то перестает поддерживаться и приходится разбираться, почему так.

    1. Посмотрите, пожалуйста, примечание к статье, теперь flac принимается только в mono режиме, audacity вполне может записать такой flac с микрофона.

    1. Рада, что у вас все получилось! Напишите, если не сложно, характеристики wav файла, с которыми у вас все вышло.

  4. Так сделал

    import json
    import urllib
    import urllib.request

    key = «key»
    url = «https://www.google.com/speech-api/v2/recognize?output=json&lang=ru-ru&key=»+key

    audio = open(«/home/xmaster/PycharmProjects/project1/myparser/proba1/115.flac»,’rb’).read()
    req = urllib.request.Request(url,data=audio,headers={‘Content-Type’: ‘audio/x-flac; rate=44100’})

    f = urllib.request.urlopen(req)
    print(f.read().decode(‘utf-8’))

  5. Спасибо! Статья очень помогла. Все получилось. Запрос к google api делал из java, конвертирование в моно flac тоже делаю средствами java. Если кому надо, пишите, код скину.

    1. Добрый день, какие библиотеки нужно цеплять на java? понять не могу..
      Хотел бы посмотреть на вашу реализацию.

    2. Сергей, какими средствами вы делали конвертирование в моно flac в java и что использовали для отправки запроса к google api? Скиньте код, пожалуйста. Заранее спасибо.

  6. Доброго времени суток. при посылке запроса все время возвращает 403 ошибку,

    var api_key =»#############»;
    var path = @»C:\test.flac»;

    var bytes = File.ReadAllBytes(path);

    var client = new WebClient();
    client.Headers.Add(«Content-Type», «audio/x-flac; rate=44100″);
    var result = client.UploadData($»http://www.google.com/speech-api/v2/recognize?lang=uk-UA&key={api_key}&output=json», «POST», bytes);

    var s = client.Encoding.GetString(result);
    Console.ReadLine();

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *