Yandex SpeechKit

Сервис Yandex SpeechKit решает задачи обработки речи.Он выполняет:
- распознавание речи в реальном времени и из аудиофайлов;
- определение языка, пола и эмоции говорящего;
- синтез речи с настройкой голоса, скорости и высоты.
В этом уроке вы узнаете:
- основные возможности SpeechKit;
- какие продуктовые сценарии можно реализовать с помощью сервиса;
- как выполнять простые запросы к SpeechKit для генерации голоса и распознавания файлов;
- как рассчитать стоимость использования SpeechKit для ваших задач.
❗️Практическая часть курса предполагает использование облачных ресурсов, которые вы оплачиваете самостоятельно. Курс разработан так, чтобы расходы были минимальными, — часть из них покроет стартовый грант.Чтобы избежать лишних трат:— останавливайте ВМ в перерывах между практиками (это не снизит потребление до нуля, но заметно сократит расходы);— настройте бюджет и уведомления в разделе Биллинг;— удаляйте ресурсы после завершения курса;— необязательно выполнять все практики — сосредоточьтесь на релевантных.💻 SpeechKit работает через интерфейсы API. В зависимости от задачи вам доступны интерфейсы gRPC или REST. В данном уроке все примеры и возможности будут рассмотрены на примерах API v3 — актуальной версии API.📚 Для быстрого знакомства с базовыми возможностями сервиса вы можете воспользоваться SpeechKit в консоли управления.


💡 Помимо облачного SpeechKit можно заказать on-premise сборку SpeechKit Hybrid для размещения в контуре заказчика. Чаще всего она требуется для банков и других организаций со строгими требованиями к информационной безопасности.Сервис речевых технологий Yandex SpeechKit состоит из двух компонентов: распознавание и синтез речи. Сегодня расскажем про них подробнее!
Распознавание речи
💡 Распознавание речи (Speech-to-Text — STT, Automatic Speech Recognition — ASR) — это процесс преобразования речи в текст.
Виды распознавания
SpeechKit предоставляет два способа распознавания речи:1️⃣ Потоковое распознаваниеПрименяется для распознавания в режиме реального времени. SpeechKit получает короткие аудиофрагменты и отправляет результаты в рамках одного соединения.Примеры сценариев: телефонный робот для подтверждения визита к врачу, умный ассистент в приложении.💡 При потоковом распознавании есть два основных типа событий: получение промежуточных и финальных результатов распознавания для фразы.Промежуточные результаты распознавания обновляются по мере речи пользователя.Сервис:
- отправляет частичные результаты во время произнесения фразы;
- корректирует их по мере поступления новых данных;
- возвращает финальный результат, когда фиксирует конец фразы.
Финальный результат используют для анализа смысла и выбора следующего действия.Промежуточные результаты позволяют реагировать на речь до её завершения и отображают процесс распознавания — приложение добавляет новые слова и уточняет предыдущие.Работа промежуточных и финальных результатов по типу:
- мы поедем — промежуточный результат фразы;
- мы поедем в — промежуточный результат фразы;
- мы поедем в Москву — промежуточный результат фразы;
- мы поедем в Москву завтра — финальный результат фразы.
2️⃣ Распознавание аудиофайловПрименяется для распознавания аудиозаписи разговора после его завершения. Такие аудио не изменяются со временем, и нет необходимости быстро возвращать результаты по каждой фразе для имитации живого общения.💡 SpeechKit может распознавать аудиозаписи в синхронном и асинхронном режимах.
- Синхронное распознавание аудиофайлов Отличается высокой скоростью ответа, отправка аудиоданных и получение результата происходит в рамках одного соединения. Во многом оно похоже на потоковое: аудиофайл также нужно нарезать на небольшие аудиофрагменты и поэтапно засылать их в сервис, но есть и отличие — промежуточные результаты не приходят.
- Асинхронное распознавание аудиофайлов Работает медленнее в сравнении с синхронным, отправка аудиоданных и получение результата происходит в три запроса:
- 1️⃣ Файл отправляется в очередь на распознавание — в ответ приходит ID операции распознавания.
- 2️⃣ В цикле выполняются запросы на отслеживание готовности результата операции.
- 3️⃣ Как только результат готов, можно выполнить запрос результатов.
Примеры сценариев: оценка качества работы оператора кол-центра поликлиники, расшифровка лекции по культурологии.Вы изучили особенности сервиса, и теперь можно перейти к пошаговым инструкциям. Далее вы узнаете, как создать запрос в SpeechKit.
Перед началом работы с API
В рамках этого урока для аутентификации используется IAM-токен. Это не единственный, но самый безопасный для продакшен-решений способ.1️⃣ Получите IAM-токен: воспользуйтесь инструкцией для аккаунта на Яндексе или для сервисного аккаунта.💡 IAM-токен валиден в течение 12 часов, после чего его нужно получить снова.2️⃣ Получите идентификатор каталога, для доступа к которому у вашего аккаунта есть роли ai.speechkit-stt.user или выше (распознавание) и ai.speechkit-tts.user или выше (синтез).3️⃣ При обращении к SpeechKit через API в каждом запросе на распознавание и синтез передавайте полученный IAM-токен как параметр в заголовке -H "Аuthorization: Bearer <IAM-токен>". Идентификатор каталога нужно указывать в заголовке запроса x-folder-id при обращении к синтезу - H "x-folder-id: <идентификатор_каталога>".
Создание запроса в SpeechKit для асинхронного распознавания файлов
💻 При желании вы можете повторить пример из урока для других аудиофайлов. Для этого их необходимо предварительно сложить на S3 от Yandex Cloud.Асинхронное распознавание файлов выполняется в три шага.
1️⃣ Постановка запроса в очередь
Создайте вспомогательный файл request.json с параметрами запроса:
{
"uri": "https://storage.yandexcloud.net/examples/marina_hi.mp3",
"recognition_model": {
"model": "general",
"audio_format": {
"container_audio": {
"container_audio_type": "MP3"
}
}
}
}
Где:
uri— путь до файла в облачном хранилище S3 от Yandex Cloud.model— модель, используемая для распознавания.
В данном случае была выбрана модель general — актуальная стабильная версия компонента распознавания.💡 Отправлять запросы можно с помощью утилиты[curl](https://curl.haxx.se/)и её аналогов.Выполните запрос:
curl -k -v -H "Authorization: Bearer <IAM_TOKEN>" -d @request.json https://stt.api.cloud.yandex.net:443/stt/v3/recognizeFileAsync
Ответ на запрос будет содержать ID запущенной операции распознавания:
{
"id": "f8dp7pdg70q6ec******",
"description": "STT v3 async recognition",
"createdAt": "<date>",
"createdBy": "******",
"modifiedAt": "<date>",
"done": false,
"metadata": null
}
Сохраните ID для отслеживания статуса операции и получения результатов распознавания.
2️⃣ Отслеживание результатов распознавания
Запрос результатов распознавания по запущенной операции нужно выполнять после завершения операции "done": true. Для отслеживания статуса операции используйте метод:
curl -k -v -X GET -H "Authorization: Bearer <IAM_TOKEN>" https://operation.api.cloud.yandex.net/operations/{id}
Вызывать его в цикле нужно до тех пор, пока поле done не примет значение true.
{
"done": true,
"id": "f8dp7pdg70q6ec******",
"description": "STT v3 async recognition",
"createdAt": "<date>",
"createdBy": "******",
"modifiedAt": "<date>"
}
3️⃣ Получение результатов распознавания
Как только операция завершена, можно запросить результаты распознавания:
curl -k -v -X GET -H "Authorization: Bearer <IAM_TOKEN>" https://stt.api.cloud.yandex.net:443/stt/v3/getRecognition?operation_id={id}
Ответ:
{"result":{"sessionUuid":{"uuid":"dec02ace-7b7e4e0a-f0c0ff99-de9b2cf","userRequestId":"f8d0btsb09sn0uu32786"},"audioCursors":{"receivedDataMs":"2000","resetTimeMs":"0","partialTimeMs":"2000","finalTimeMs":"2000","finalIndex":"0","eouTimeMs":"0"},"responseWallTimeMs":"88","final":{"alternatives":[{"words":[{"text":"привет","startTimeMs":"240","endTimeMs":"859"},{"text":"меня","startTimeMs":"940","endTimeMs":"1160"},{"text":"зовут","startTimeMs":"1220","endTimeMs":"1480"},{"text":"марина","startTimeMs":"1540","endTimeMs":"2000"}],"text":"привет меня зовут марина","startTimeMs":"0","endTimeMs":"2000","confidence":0,"languages":[]}],"channelTag":"0"},"channelTag":"0"}}
{"result":{"sessionUuid":{"uuid":"dec02ace-7b7e4e0a-f0c0ff99-de9b2cf","userRequestId":"f8d0btsb09sn0uu32786"},"audioCursors":{"receivedDataMs":"2000","resetTimeMs":"0","partialTimeMs":"2000","finalTimeMs":"2000","finalIndex":"0","eouTimeMs":"0"},"responseWallTimeMs":"88","finalRefinement":{"finalIndex":"0","normalizedText":{"alternatives":[{"words":[{"text":"привет","startTimeMs":"240","endTimeMs":"859"},{"text":"меня","startTimeMs":"940","endTimeMs":"1160"},{"text":"зовут","startTimeMs":"1220","endTimeMs":"1480"},{"text":"марина","startTimeMs":"1540","endTimeMs":"2000"}],"text":"Привет меня зовут марина","startTimeMs":"0","endTimeMs":"2000","confidence":0,"languages":[]}],"channelTag":"0"}},"channelTag":"0"}}
{"result":{"sessionUuid":{"uuid":"dec02ace-7b7e4e0a-f0c0ff99-de9b2cf","userRequestId":"f8d0btsb09sn0uu32786"},"audioCursors":{"receivedDataMs":"2000","resetTimeMs":"0","partialTimeMs":"2000","finalTimeMs":"2000","finalIndex":"0","eouTimeMs":"2000"},"responseWallTimeMs":"88","eouUpdate":{"timeMs":"2000"},"channelTag":"0"}
Ответ содержит подробную текстовую расшифровку аудиофайла. В рамках этого урока подробно будут рассмотрены только те данные, которые относятся к событию final.Внутри вы увидите массив текстовых альтернатив.💡 На данный момент всегда возвращается лишь одна альтернатива результатов распознавания, но в дальнейшем это поведение изменится.Внутри альтернативы для фразы и составляющих её слов указаны текст, время начала и время окончания в миллисекундах:
{
"final": {
"alternatives": [
{
"words": [
{
"text": "привет",
"startTimeMs": "240",
"endTimeMs": "859"
},
{
"text": "меня",
"startTimeMs": "940",
"endTimeMs": "1160"
},
{
"text": "зовут",
"startTimeMs": "1220",
"endTimeMs": "1480"
},
{
"text": "марина",
"startTimeMs": "1540",
"endTimeMs": "2000"
}
],
"text": "привет меня зовут марина",
"startTimeMs": "0",
"endTimeMs": "2000",
...
}
],
"channelTag": "0"
}
}
Таким образом можно получить подробную расшифровку аудиофайла с временными метками всех составляющих его слов и фраз. Временные метки пригодятся, например, для создания приложений по типу караоке, обнаружения перебиваний собеседниками друг друга и для подсчёта статистик разговора в приложениях речевой аналитики.
Опции распознавания
В каждом из приведённых выше способов можно задать дополнительные опции для:
- работы с несколькими языками;
- детекции автоответчика;
- определения уровня негатива в речи говорящего;
- определения пола говорящего;
- расстановки знаков препинания в результатах распознавания;
- отображения цифр в результатах (нормализации);
- восстановления диалога двух спикеров из моноканала;
- определения обсценной лексики, оскорблений по тексту;
- подсчёта статистик речи по разным каналам (процентов тишины, одновременной речи и т. д.).
Дообучение распознавания
В большинстве случаев сервис хорошо распознаёт аудио, но в некоторых случаях нужно дообучение. В основном это касается узкоспециализированной лексики. Улучшить качество помогут примеры текстовых фраз и аудио.
Синтез
💡 Синтез речи (Text-to-Speech — TTS) — это процесс преобразования текста в речь.Основные режимы работы синтеза:
- Полнотекстовый синтез Режим работы синтеза речи, при котором для выбранного голоса и переданного текста синтезируется аудио.
- Синтез по аудиошаблону На вход подаётся аудио с указанием, какие слова и на что нужно заменить. В ответ сервис возвращает синтезированное аудио, озвученное голосом, скопированным из исходного аудио. Например, в исходном аудио фраза звучит как Ваш заказ находится по адресу улица Фрунзенская. Забрать можно с восьми утра до шести вечера ежедневно*.* Вам же для другого пункта выдачи нужно голосовое оповещение, в котором Фрунзенская заменена на Ленинcкая.
Использование полнотекстового синтеза позволяет не зависеть от диктора, в то время как для каждого нового аудиошаблона диктора нужно будет записывать снова. При этом результат генерации по аудиошаблону может дать более эмоционально богатый результат, чем полнотекстовый синтез.
Полнотекстовый синтез
Вы можете выбрать голос, который будет озвучивать текст. Каждый голос соответствует модели, обученной на речи диктора. Голоса отличаются тембром, полом и языком говорящего, а также количеством поддерживаемых амплуа.💡 Амплуа — это характер произношения одного и того же диктора. Для разных голосов доступны разные наборы амплуа.Например, у голоса marina есть три амплуа:
- neutral — нейтральное амплуа
- whisper — амплуа шёпота
- friendly — дружелюбное амплуа
Если ни один голос не подходит вашему бизнесу, SpeechKit может создать уникальный — специально для вас. Услуга создания голоса на заказ называется Brand Voice. Её можно заказать под ключ от записи диктора в нескольких амплуа до создания модели голоса (Brand Voice Premium) или в упрощённом режиме, когда клиент самостоятельно записывает диктора, а затем заливает имеющиеся данные через специальный интерфейс, а сервис «заваривает» на них модель (Brand Voice Lite).Вы можете управлять полнотекстовым синтезом:
- настраивать произношение конкретного текста через текстовую разметку: проставлять смысловые ударения, а также задавать паузы, ударения в словах, произношение отдельных слов через фонетическую транскрипцию;
- регулировать скорость произношения;
- задавать нужную высоту голосу и т. д.
Создание запроса с настройкой голоса в амплуа и ударения
💻 При желании вы можете повторить пример из урока. Для этого потребуется утилита jq для работы с файлами JSON.1️⃣ Создайте вспомогательный файл request.json с параметрами запроса:
{
"text": "А вы знаете, как поставить ударение в Спичк+ит?",
"hints": [
{
"voice": "marina"
},
{
"role": "whisper"
}
]
}
Где:
text— синтезируемый текст;+— используется для постановки ударения;hints— список параметров синтеза:voice— голос для синтеза;role— амплуа.
2️⃣ Выполните запрос:
curl -H "Authorization: Bearer <IAM_TOKEN>" \
-H "x-folder-id: <FOLDER_ID>" \
-d @request.json https://tts.api.cloud.yandex.net:443/tts/v3/utteranceSynthesis |
jq -r '.result.audioChunk.data' |
while read chunk; do base64 -d <<< "$chunk" >> audio.wav; done
3️⃣ Синтезированная речь будет записана в файл audio.wav:
Создание запроса с настройкой скорости речи
💻 При желании вы можете повторить пример из урока. Для этого потребуется утилита jq для работы с файлами JSON.1️⃣ Создайте вспомогательный файл request.json с параметрами запроса:
{
"text": "Нет времени объяснять. Срочно записывай!",
"hints": [
{
"voice": "kirill"
}
],
"speed": 1.2
}
Где:
text— синтезируемый текст;hints— список параметров синтеза:voice— голос для синтеза;
speed— скорость синтеза.
2️⃣ Выполните запрос:
curl -H "Authorization: Bearer <IAM_TOKEN>" \
-H "x-folder-id: <FOLDER_ID>" \
-d @request.json https://tts.api.cloud.yandex.net:443/tts/v3/utteranceSynthesis |
jq -r '.result.audioChunk.data' |
while read chunk; do base64 -d <<< "$chunk" >> audio.wav; done
3️⃣ Синтезированная речь будет записана в файл audio.wav:
Синтез по аудиошаблону
💡 При синтезе по шаблону на вход подаётся аудиофайл с записью речи и указывается, какие слова в этом файле переменные и на что нужно заменить подставляемые значения.Также разница между полнотекстовым и по аудиошаблону в том, что в первом случае вы передаёте текст, указывая с помощью разметки, что и как нужно произносить. Во втором все эти настройки и эмоциональный контур фразы переносятся автоматически из исходного аудио.
📚 Синтез по аудиошаблону доступен для клиентов-владельцев Brand Voice Premium, Brand Voice Lite и клиентов с доступом к Brand Voice Call Center (BV CC) — специальному режиму работы для обслуживания кол-центров. Подробнее об этих продуктах можно прочитать в документации.💡 Доступ к Brand Voice Call Center запрашивается через поддержку сервиса.Рассмотрите, как работает шаблонный синтез на примере BV CC — режима синтеза, когда по имеющемуся аудио с голосом можно получить новое аудио с тем же голосом, но с другими значениями переменной и результирующим качеством в 8 KHz.Представьте ситуацию, что маркетплейсу необходимо настроить автоматическое голосовое напоминание о завершении срока хранения посылок в пункте выдачи, указав конкретный адрес.
Сначала необходимо выбрать запись для шаблонизации и обозначить переменную для изменения. В конкретном примере переменная — это адрес пункта выдачи.Например, исходное аудио:
Здравствуйте! Заканчивается срок хранения вашего заказа в пункте выдачи на Льва Толстого. Вы подойдёте?
Сценарии использования сервиса SpeechKit
Возможности сервиса используются в самых разнообразных сценариях, изучите их:

Тарификация
💡 Стоимость рассчитывается за календарный месяц.
Использование синтеза речи
Стоимость использования зависит от количества отправленных запросов на синтез.❗️ По умолчанию запросы на синтез речи содержат ограничения — 250 символов и 24 секунды.Для синтеза более длинных фраз используйте режим unsafe_mode. Тогда тарифицироваться будут каждые 250 символов, например:
- запрос меньше 250 символов — одна единица тарификации;
- запрос от 250 до 500 символов — две единицы тарификации;
- запрос от 500 до 750 символов — три единицы тарификации;
- пустой запрос тарифицируется как одна единица тарификации.
Использование распознавания речи
Тарификация в данном случае зависит от типа распознавания.
Синхронное распознавание
Единица тарификации — отрезок одноканального аудио длительностью 15 секунд. Отрезки меньшей длительности округляются в большую сторону (1 секунда превращается в 15 секунд).
Асинхронное распознавание
Единица тарификации — 1 секунда двухканального аудио. Отрезки меньшей длительности округляются в большую сторону. Количество каналов округляется до чётного числа.Минимум начисляется 15 секунд за каждые два канала. Аудио меньшей длительности тарифицируется как 15 секунд.📚 Актуальные цены смотрите в разделе Тарификация сервиса.
💻 Практика. Синтезирование фразы в SpeechKit
1️⃣ Синтезируйте следующую фразу:Всем привет! Меня зовут {ваше настоящее имя} со скоростью 1.2 в двух разных амплуа.2️⃣ Для синтеза выберите один из следующих голосов:
- marina
- neutral (по умолчанию)
- whisper
- friendly
- masha
- good (по умолчанию)
- strict
- friendly
- lera
- neutral (по умолчанию)
- friendly
- dasha
- neutral (по умолчанию)
- good
- friendly
- kirill
- neutral (по умолчанию)
- strict
- good
- anton
- neutral (по умолчанию)
- good
- alexander
- neutral (по умолчанию)
- good
- ermil
- neutral (по умолчанию)
- good
3️⃣ Полученные аудио сохраните как audio_amp1.wav и audio_amp2.wav.Пришло время закрепить полученные знания и пройти небольшой тест!
0 комментариев