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

Разработка этого проекта была чем-то новым для меня, так как я никогда раньше не изучал распознавание речи, и выбор одного из множества доступных сервисов, таких как облако Google и IBM Watson, потребовал небольшого исследования.

В конце концов, я выбрал IBM watson по той простой причине, что у watson есть лучшая документация для начинающих, и регистрация в IBM watson очень проста и не требует предоставления данных дебетовой/кредитной карты, в отличие от Google.

После регистрации в Watson Speech to Text вам будут предоставлены имя пользователя и пароль, которые вы будете использовать для аутентификации при каждом запросе. Услуга поставляется с 100 минутами бесплатной ежемесячной квоты, и сверх этого требуется обновление учетной записи.

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

Теперь, когда мы изучили поставленную задачу и различные службы преобразования речи в текст. мы можем увидеть, как я реализовал.

  • Непотоковая служба

Внедрение непотокового сервиса было довольно простой задачей. IBM Watson предоставляет API для отдыха, и вам просто нужно сделать почтовый запрос с аудиофайлом, позволить серверу выполнить работу и отправить вам результаты. Для выполнения действительного почтового запроса требуется имя пользователя и пароль аутентификации.

Пример кода:

import requests
# request url is given when you signup for speech to text service
response_data = requests.post(url, auth=(username, password),                                    
                 headers=headers)
  • Потоковая служба

Внедрение службы потоковой передачи было немного сложным, учитывая, что я очень мало знаю javascript, и он работает, имея двунаправленное соединение через веб-сокет, отправляя данные туда и обратно между клиентом и сервером. Теперь веб-сокет отправляет пакет данных по одному TCP-соединению и тем самым снижает накладные расходы на соединение для каждого запроса.

В службе потоковой передачи уникальный токен также отправляется вместе с фрагментом аудиоданных, и сервер отвечает результатами. Уникальный токен действителен только в течение 1 часа, что означает, что вам нужно сгенерировать его снова, чтобы сделать действительный запрос.

К счастью, Watson предоставляет модуль Python, который можно установить через pip. И вы можете сделать запрос Get для получения токена. Я создал отдельную конечную точку, к которой был сделан запрос на получение токена перед подключением к веб-сокету.

Пример кода для создания токена:

from watson_developer_cloud import AuthorizationV1 as Authorization
from watson_developer_cloud import SpeechToTextV1 as SpeechToText
authorization = Authorization(username=username, password=password)     
return HttpResponse(authorization.get_token(url=SpeechToText.default.                url),content_type='text/plain')

Теперь у IBM watson есть watson-speech модуль npm, который поможет вам делать запросы и получать данные в режиме реального времени из javascript на стороне клиента. Но проблема в том, что без внешнего управления зависимостями вам нужно загрузить полную библиотеку и все ее зависимости и указать путь к ней в атрибуте src в вашем теге html-скрипта, что является неразумным и неправильным подходом, или вы можете выбрать, как модули устанавливаются через Менеджер пакетов npm, который можно использовать в приложении nodejs через функцию require, что является более простым способом включения сторонних модулей в Javascript, я выбрал последний из-за его простоты и читабельности кода.

Теперь, чтобы использовать модули npm, вам нужно установить node и npm в вашей системе и запустить команду npm init, которая создаст файл package.json в вашем проекте, в котором будут храниться все зависимости внешнего интерфейса вместе с метаданными проекта.

Затем, чтобы использовать функциональные возможности nodejs, нам нужно преобразовать простой vanilla js в собственный код nodejs, для этого есть пакет npm, называемый browsify, который берет ваш файл javascript с функциональностью nodejs и включает все зависимости в выходной файл bundle.js ( названы по соглашению).

browsify app.js -o bundle.js

Мы решили большую часть проблемы, и осталось написать файл app.js, который будет запрашивать у нашей конечной точки токен с помощью javascript fetch api, а затем подключаться к веб-сокету Watson и отправлять поток аудиоданных для обработки и обработки. получать данные с промежуточными результатами в режиме реального времени с помощью элемента javascript или html.

Код для получения токена из конечной точки /api/speech-to-text/token:

function onListenClick(){ 
fetch(‘/api/speech-to-text/token’)
.then(function(response) { 
return response.text(); 
})

Чтобы получить полный рабочий код в python/django. Вы можете обратиться к моему репо здесь.