Итак, вы хотите транскрибировать звук с вашего микрофона в режиме реального времени с помощью легкодоступного API с хорошим временем отклика?
Вот что нам нужно для этого:
* Angular 14
* Node.js 16 (мы будем использовать Express и TypeScript)
* Socket.io
* Google Speech Библиотека API для Node.js
Настройка серверной части
mkdir server && cd server
npm init -y
npm i -D typescript @tsconfig/node16 concurrently @types/pumpify @types/node @types/express
npx tsc --init
npm i socket.io express
Затем мы открываем файл tsconfig.json, сгенерированный приведенной выше командой. Убедитесь, что это выглядит примерно так:
{"extends": "@tsconfig/node16/tsconfig.json",
"compilerOptions": { "target": "es5", "module": "commonjs", "outDir": "dist", "strict": true, "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true },"include": ["src"], "exclude": ["node_modules"]
}
Давайте настроим TypeScript для отслеживания изменений в коде и перенесем их в JavaScript на лету с помощью concurrently. Добавьте следующий скрипт в свой файл package.json.
"scripts": { "dev": "concurrently \"npx tsc --watch\" \"nodemon -q ./dist/index.js\" }
Теперь, чтобы запустить сервер, просто запустите npm run dev.
Настройте среду для доступа к Google Cloud Speech API.
Чтобы получить доступ к API преобразования речи в текст, нам нужно установить файл JSON учетной записи службы в качестве переменной среды.
Следуйте инструкциям на этой странице: Перед началом работы | Облачная документация по преобразованию речи в текст | Облако Google
Кодирование файла server.ts
Это базовый шаблон сервера express, который вы можете использовать для запуска.
Следующий шаг — настроить socket.io и добавить несколько прослушивателей событий.
Давайте рассмотрим, что здесь делают прослушиватели событий:
startGoogleCloudStream: как следует из названия, инициализирует класс speechToTextUtils и устанавливает необходимые параметры, которые мы вскоре рассмотрим.
binaryAudioData: получает аудиоданные от внешнего интерфейса в виде двоичных буферов int16. Это обрабатывается функцией receiveData в speechToTextUtils.
endGoogleCloudStream: вызывает вспомогательную функцию, которая отключает все прослушиватели событий и транскрипцию.
У нас есть пара сеттеров, которые помогают нам сохранить экземпляр сокета и конфигурацию запроса.
Метод startRecognitionStream инициализирует облачный речевой клиент с конфигурацией запроса и привязывает speechCallback, который запускается каждый раз, когда API Google возвращает ответ транскрипции.
Мы используем мелок, чтобы выделить временные метки, а транскрипции отображаются красным цветом и зеленым цветом, как только они будут окончательными.
restartTimeoutзапускает метод restartStream, когда таймер достигает примерно 5 минут, так как это максимальный предел непрерывного распознавания, установленный Google для Speech-To-Text API.
Как обрабатывается входной звук? Мы рассмотрим это дальше.
Эта функция receiveData взята из репозитория Github client library узла от Google. Он записывает полученные двоичные фрагменты аудиоданных в streamingRecognize.
По умолчанию у Google есть пятиминутный тайм-аут для любого запроса API распознавания потоковой передачи. Чтобы выполнять транскрипцию дольше этого предела, мы используем эти две функции, представленные в образцах, предоставленных Google.
Крайне важно, чтобы мы удалили все прослушиватели событий, иначе Node взбесится.
Теперь перейдем к фронтенду.
Настройка клиентской части
Запустите эти команды, чтобы настроить угловой проект
mkdir client && cd client npx ng new speech-to-text --directory=. npm install @google-cloud/speech socket.io-client
Вы можете настроить файлы app.component по своему усмотрению, но базовый шаблон должен иметь подключение к сокету следующим образом.
Вы можете использовать переменную liveTranscription для вывода транскрипции в виде HTML через привязку данных Angular.
Мы используем AudioContextAPI для обработки звука с микрофона и отправки его на серверную часть через соединение через сокет. Google STT API ожидает звук в 16-битных целых числах, чтобы преобразовать его, нам нужно подключить специальный аудиопроцессор, который будет передискретизировать входной сигнал нашего микрофона.
ПРИМЕЧАНИЕ. Убедитесь, что файл audio-processor.js хранится в папке assets, иначе Angular не обнаружит его.
Поскольку Aаудиопроцессор добавляется как рабочий процесс, он отсоединяется от основного потока выполнения. Итак, мы не можем отправить данные в сокет из файла аудиопроцессора. Вместо этого мы используем встроенную функцию обмена сообщениями для отправки выбранных байтов обратно в служебный файл.
Теперь мы можем отправить звук в сокет.
Используя EventListener, мы можем дождаться отправки расшифрованных строк с сервера и обработать их по своему усмотрению. Распечатать их на экране? Живые субтитры для ваших видео? Все возможно.
Даже что-то вроде этого: Разминка интервью — Расти вместе с Google.
На этом статья заканчивается, ставьте лайки, если вам понравилось❤️
Эта статья должна дать вам краткое изложение подробного кода, представленного здесь: GitHub.
Загляните на мой сайт здесь