Что такое DeepSpeech?

DeepSpeech — это механизм распознавания речи с открытым исходным кодом, который произвёл фурор в сообществе машинного обучения, особенно среди тех, кто увлечён волшебством преобразования произнесённых слов в письменный текст. Разработанный Mozilla и основанный на новаторской исследовательской работе Baidu «Глубокая речь: расширение масштабов распознавания речи от начала до конца», DeepSpeech предлагает надёжный и доступный способ создания систем автоматического распознавания речи.

Происхождение и философия

Первоначальное предложение для DeepSpeech было простым, но революционным: создать систему распознавания речи, полностью основанную на глубоком обучении. Этот подход отвергает традиционные методы, основанные на ручном проектировании функций и словарях фонем, вместо этого используя большие наборы данных и нейронные сети для изучения паттернов непосредственно на аудиоданных. Такой сквозной подход оказался более надёжным и эффективным, особенно при работе с фоновым шумом и различными речевыми паттернами.

Настройка DeepSpeech

Чтобы начать работу с DeepSpeech, вам нужно установить несколько важных библиотек. Вот краткое изложение того, что вам нужно:

pip install deepspeech numpy webrtcvad
  • deepspeech: основная библиотека для распознавания речи.
  • numpy: для численных вычислений.
  • webrtcvad: библиотека обнаружения голосовой активности (VAD), разработанная Google для WebRTC, которая помогает идентифицировать голосовые аудиокадры.

Загрузка предварительно обученных моделей

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

wget https://github.com/mozilla/deepspeech/releases/download/v0.9.3/deepspeech-0.9.3-models.tar.gz
tar xzf deepspeech-0.9.3-models.tar.gz

Создание кадров аудиоданных

Чтобы обработать аудиоданные, вам необходимо разбить их на управляемые кадры. Вот простой класс и функция для этого:

import numpy as np

class Frame:
    def __init__(self, bytes, timestamp, duration):
        self.bytes = bytes
        self.timestamp = timestamp
        self.duration = duration

def frame_generator(frame_duration_ms, audio, sample_rate):
    n = int(sample_rate * (frame_duration_ms / 1000.0) * 2)
    offset = 0
    timestamp = 0.0
    duration = (float(n) / sample_rate) / 2.0
    while offset + n <= len(audio):
        yield Frame(audio[offset:offset+n], timestamp, duration)
        timestamp += duration
        offset += n

Эта функция frame_generator принимает продолжительность кадра, аудиоданные и частоту дискретизации в качестве входных данных и выдаёт объекты Frame, каждый из которых представляет сегмент аудиоданных.

Сбор кадров с активированным голосом

Обнаружение голосовой активности (VAD) имеет решающее значение для эффективного распознавания речи. Вот как вы можете использовать webrtcvad для сбора голосовых кадров:

import webrtcvad

def collect_voiced_frames(sample_rate, frame_duration_ms, padding_duration_ms, vad, audio):
    vad.set_mode(3)  # Агрессивный режим
    num_padding_frames = int(padding_duration_ms / frame_duration_ms)
    ring_buffer = [False] * (num_padding_frames * 2 + 1)
    triggered = False
    voiced_frames = []
    for frame in frame_generator(frame_duration_ms, audio, sample_rate):
        is_speech = vad.is_speech(frame.bytes, sample_rate)
        ring_buffer.append(is_speech)
        ring_buffer.pop(0)
        if not triggered:
            num_voiced = sum(ring_buffer)
            if num_voiced > 0.9 * len(ring_buffer):
                triggered = True
                voiced_frames.append(frame)
        else:
            voiced_frames.append(frame)
            num_unvoiced = len(ring_buffer) - sum(ring_buffer)
            if num_unvoiced > 0.9 * len(ring_buffer):
                break
    return voiced_frames

Эта функция использует заполненный кольцевой буфер для обнаружения голосовых кадров и срабатывает, когда процент голосовых кадров превышает определённый порог.

Речь в текст с помощью DeepSpeech

Теперь давайте углубимся в основную функциональность преобразования речи в текст с помощью DeepSpeech:

import deepspeech

def speech_to_text(model, audio, sample_rate):
    model.enableExternalScorer('scorer.scorer')
    model.setScorerAlphaBeta(0.75, 1.85)
    text = model.stt(audio)
    return text

# Загрузить модель
model_file_path = "deepspeech-0.9.3-models.pbmm"
scorer_file_path = "deepspeech-0.9.3-models.scorer"
model = deepspeech.Model(model_file_path)
model.enableExternalScorer(scorer_file_path)

# Пример использования
audio_file = "example.wav"
with open(audio_file, "rb") as f:
    audio = np.frombuffer(f.read(), dtype=np.int16)
text = speech_to_text(model, audio, 16000)
print(text)

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

Распознавание речи в реальном времени и асинхронно

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

Интерфейс командной строки

import sys
import os
import logging
import argparse
import subprocess
import shlex

def main():
    parser = argparse.ArgumentParser(description='Интерфейс командной строки DeepSpeech')
    parser.add_argument('--audio', help='Путь к аудиофайлу')
    parser.add_argument('--stream', action='store_true', help='Использовать поток микрофона')
    args = parser.parse_args()

    if args.audio:
        # Асинхронное распознавание речи
        audio_file = args.audio
        with open(audio_file, "rb") as f:
            audio = np.frombuffer(f.read(), dtype=np.int16)
        text = speech_to_text(model, audio, 16000)
        print(text)
    elif args.stream:
        # Распознавание речи в реальном времени
        subprocess.run(shlex.split("arecord -f S16_LE -r 16000 -c 1 -"), stdout=subprocess.PIPE)

if __name__ == "__main__":
    main()

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

Как работает DeepSpeech

Архитектура

DeepSpeech использует рекуррентную нейронную сеть (RNN) для обработки спектрограмм речи и создания транскрипций текста. Вот общий обзор архитектуры:

graph TD A("Вход аудио") --> B("Извлечение MFCC") B --> C("Нерекуррентные слои") C --> D("Рекуррентный слой") D --> E("Выходной слой") E --> F("Расчёт потерь CTC") F --> B("Транскрипция текста")

Модель RNN состоит из пяти слоёв:

  • Нерекуррентные слои: эти слои обрабатывают кадры аудио независимо.
  • Рекуррентный слой: этот слой включает прямую рекурсию для обработки последовательных данных.
  • Выходной слой: этот слой генерирует вероятности символов для каждого временного среза.

Обучение и вывод

DeepSpeech можно обучить с использованием корпуса голосовых данных. Процесс обучения включает обновление параметров модели для минимизации потерь, обычно с использованием оптимизатора Adam. Для вывода используется обученная модель для преобразования записанного звука в текст. Производительность оценивается с помощью таких показателей, как коэффициент ошибок слов (WER) и коэффициент ошибок символов (CER).

Обнаружение активности голоса

Обнаружение активности голоса (VAD) является важным компонентом DeepSpeech, помогая идентифицировать голосовые кадры и отфильтровывать тишину и фоновый шум. Вот упрощённая блок-схема процесса VAD:

graph TD A("Кадры аудио") --> B("Алгоритм VAD") B --> C("Обнаружение голосового кадра") C -->|Да|D(Сбор голосовых кадров) C -->|Нет| E("Отбросить кадр") D --> B("Расшифровать голосовые кадры")

Алгоритм