June 24, 2023

pocketsphinx

Без использования Google можно использовать другие библиотеки для распознавания речи на Python, например, PocketSphinx.

Пример кода для распознавания речи в реальном времени и сохранения распознанных слов в массиве numpy:

import pyaudio
import numpy as np
import pocketsphinx as ps

# настройки записи
FORMAT = pyaudio.paInt16  # формат звука
CHANNELS = 1  # количество каналов (моно)
RATE = 16000  # частота дискретизации
CHUNK = 1024  # размер блока записи

# создаем объект PyAudio
audio = pyaudio.PyAudio()

# создаем объект Decoder для распознавания речи
config = ps.Decoder.default_config()
config.set_string('-hmm', '/path/to/model')  # путь к модели распознавания речи
config.set_string('-dict', '/path/to/dict')  # путь к словарю
decoder = ps.Decoder(config)

# открываем поток для записи звука
stream = audio.open(format=FORMAT,
                    channels=CHANNELS,
                    rate=RATE,
                    input=True,
                    frames_per_buffer=CHUNK)

print("Запись началась")

# инициализация переменных для хранения звуковых сегментов
segments = []
current_segment = []

# функция, которая обрабатывает звуковые сегменты
def on_segment(segment):
    # преобразуем сегмент в массив numpy с форматом int16
    segment = np.array(segment).astype(np.int16)

    # добавляем сегмент в список
    segments.append(segment)

    # распознаем речь
    decoder.start_utt()
    decoder.process_raw(segment, False, False)
    decoder.end_utt()
    text = decoder.hyp().hypstr
    if text != "":
        print(f"Распознанный текст: {text}")
        
        # сохраняем распознанный текст в массив numpy с форматом str
        text_str = np.array([text]).astype(np.str)
        np.save('recognized_text.npy', text_str)

# читаем данные из потока, пока он не будет остановлен
while True:
    data = stream.read(CHUNK)
    # конвертируем байты в массив NumPy
    # используем dtype=int16 для корректного преобразования
    samples = np.frombuffer(data, dtype=np.int16)

    # добавляем значения в переменную для текущего сегмента
    current_segment.extend(samples)

    # если текущий сегмент содержит звук, вызываем on_segment
    if np.max(samples) > 500:
        on_segment(current_segment)
        current_segment = []

# останавливаем поток
 записи
stream.stop_stream()
stream.close()
audio.terminate()

'''
В этом примере используется библиотека PocketSphinx 
для распознавания речи. Распознанный текст сохраняется
в массиве numpy с помощью функции numpy.save.
Чтобы распознавание работало, нужно загрузить модель
распознавания речи и словарь
'''