Переводим аудио в текст. Часть 2

Про­дол­жа­ем мега­про­ект, в кото­ром поста­вим себе на служ­бу без­раз­мер­ное обла­ко Яндек­са. Зада­ча — вос­поль­зо­вать­ся облач­ным сер­ви­сом Яндек­са, кото­рый отве­ча­ет за рас­шиф­ров­ку тек­ста из аудиофайла.

Вче­ра мы под­го­то­ви­ли «Яндекс.Облако» и разо­бра­лись с тех­но­ло­ги­я­ми, кото­рые будем исполь­зо­вать. Теперь мож­но отправ­лять фай­лы на сер­вер и полу­чать текст.

Технические детали

В про­ек­те мы будем рас­по­зна­вать длин­ные аудио. Яндекс счи­та­ет длин­ны­ми запи­си от 30 секунд и боль­ше одно­го мега­бай­та, но никто не меша­ет отпра­вить на рас­по­зна­ва­ние файл с мень­шей дли­тель­но­стью запи­си. Так тоже можно.

Фор­ма­ты аудио, кото­рые пони­ма­ет ней­ро­сеть Яндек­са на момент напи­са­ния ста­тьи, — LPCM и OggOpus. Мы будем рабо­тать со вто­рым: он зани­ма­ет мень­ше места и про­ще в обра­бот­ке. MP3 пока не поддерживается.

Рас­по­зна­ёт­ся толь­ко рус­ская речь.

Готовим файл

Нам нужен файл в фор­ма­те OggOpus и рас­ши­ре­ни­ем .ogg. Если ваш дик­то­фон, теле­фон или ком­пью­тер не уме­ют сохра­нять аудио в таком фор­ма­те, исполь­зуй­те любой аудио­кон­вер­тер — онлайн-сервис или в виде про­грам­мы на компьютере.

Напри­мер, это может рабо­тать так: нахо­ди­те в интер­не­те любой сер­вис кон­вер­та­ции аудио, выби­ра­е­те фор­мат Opus (про­сто Ogg не пой­дёт — не тот кодек) и сохра­ня­е­те файл в этом фор­ма­те. Затем меня­е­те рас­ши­ре­ние на .ogg вме­сто .opus — и у вас полу­чил­ся файл нуж­но­го формата.

Если ауди­о­за­пи­сей пока ника­ких нет, исполь­зуй­те тесто­вый файл speech.ogg, потре­ни­руй­тесь на нём.

Загружаем файл на сервер

Теперь нуж­но гото­вый файл отпра­вить в «Яндекс.Облако». Место, где хра­нят­ся фай­лы в облач­ном сер­ви­се, назы­ва­ет­ся «бакет» («вед­ро» по-нашему). Что­бы сде­лать новое вед­ро, захо­дим в кон­соль, пере­хо­дим в раз­дел Object Storage и нажи­ма­ем «Создать бакет»:

В появив­шем­ся окне при­ду­мы­ва­ем имя и нажи­ма­ем «Создать бакет»:

Нам нуж­но загру­зить файл в этот бакет. Для это­го захо­дим в него и пере­тас­ки­ва­ем туда мыш­кой наш файл:

Послед­нее, что оста­лось, — узнать путь к фай­лу. Для это­го нажи­ма­ем на сам файл, выби­ра­ем «Полу­чить ссыл­ку» и копи­ру­ем её. Она нам при­го­дит­ся на послед­нем этапе:

Добавляем нужные библиотеки в Python

Мы будем писать программу-обработчик на Python, поэто­му перед нача­лом убе­ди­тесь, что он есть у вас на ком­пью­те­ре.

Что­бы отправ­лять запро­сы на сер­вер и при­ни­мать в ответ гото­вый текст, нам нуж­на python-библиотека requests. Уста­но­вим её из команд­ной стро­ки в PowerShell. Если у вас Мак — то через Терминал:

pip install requests --user
Что­бы уста­нов­щик не выда­вал в кон­це подоб­ные пре­ду­пре­жде­ния, добавь­те путь к скрип­там в гло­баль­ную пере­мен­ную PATH. 

Пишем программу

К это­му момен­ту у нас уже есть аудио­файл в нуж­ном фор­ма­те, он залит в хра­ни­ли­ще, оста­лось толь­ко рас­по­знать его. Вот что нам для это­го нужно:

  1. API-ключ → его мы полу­ча­ли в пер­вой части.
  2. Путь к фай­лу в баке­те → полу­чи­ли, когда зали­ва­ли файл в хранилище.

Эти дан­ные мы вста­вим в наш код на Python. Логи­ка про­грам­мы про­стая: под­го­тав­ли­ва­ем все дан­ные и отправ­ля­ем запрос на рас­по­зна­ва­ние. Пока сер­вер не отве­тит, что всё гото­во, ждём. Как толь­ко при­хо­дит ответ — выво­дим гото­вый текст на экран.

# -*- coding: utf-8 -*-
# Подключаем нужные библиотеки
import requests
import time
import json
# Вставьте свой API-ключ 
key = 'AQVNsdKJKgeu[IUyRRERhjkOUiiu9Jo6'
# Вставьте свой путь к файлу в бакете. Всё, что в ссылке стоит после знака вопроса, можно стереть — сервер всё равно это проигнорирует
filelink = 'https://storage.yandexcloud.net/bucketname/speech.ogg'
# Показываем «Облаку», что мы будем распознавать именно длинное аудио
POST = "https://transcribe.api.cloud.yandex.net/speech/stt/v2/longRunningRecognize"
# Формируем сам текст запроса
body ={
    "config": {
        "specification": {
            "languageCode": "ru-RU"
        }
    },
    "audio": {
        "uri": filelink
    }
}
# Формируем заголовок запроса, в котором ссылаемся на API-ключ
header = {'Authorization': 'Api-Key {}'.format(key)}
# Отправляем запрос на распознавание
req = requests.post(POST, headers=header, json=body)
# Получаем технический ответ от сервера и выводим его
data = req.json()
print(data)
# Получаем идентификатор запроса
id = data['id']
# Запрашиваем на сервере статус операции, пока распознавание не будет завершено
while True:
    # Ждём одну секунду
    time.sleep(1)
    # Пытаемся получить ответ по нашему идентификатору запроса
    GET = "https://operation.api.cloud.yandex.net/operations/{id}"
    req = requests.get(GET.format(id=id), headers=header)
    req = req.json()
    # Если готово — выходим из цикла
    if req['done']: break
    # Если не вышли из цикла — выводим сообщение
    print("Ещё не готово")
# Выводим готовый текст 
print("Текст:")
for chunk in req['response']['chunks']:
    print(chunk['alternatives'][0]['text'])
Резуль­тат рас­по­зна­ва­ния тесто­во­го файла. 

Что дальше

Даль­ше будем созда­вать аудиок­ни­ги и рас­кры­вать весь потен­ци­ал движ­ка SpeechKit. Ну и заод­но будем про­грам­ми­ро­вать на Python 🙂