Преобразование голоса в текст во время разговора в Python

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

https://www.youtube.com/watch?v=96AO6L9qp2U&t=2s&ab_channel=StormHack в мин. 2:31.

Обратите внимание на верхний правый угол монитора Тони. Он преобразует его голос в текст во время разговора. Я хочу сделать то же самое. Это можно сделать?

Это вся моя программа:

import speech_recognition as sr 
import pyaudio


r = sr.Recognizer()
with sr.Microphone() as source:
    print("Listening...")
    audio = r.listen(source)
    try:
        text = r.recognize_google(audio)
        print("You said : {}".format(text))
    except:
        print("Sorry could not recognize what you said")

Решение, советы, подсказки или что-нибудь будет высоко ценится, заранее спасибо.

2 ответа

Для этого вам нужно будет сделать то, что называется VAD: Voice Audio Detection, простой способ сделать это - взять набор образцов из звука и получить их интенсивность, если они выше определенного порога, вам следует начать запись, как только интенсивность падает ниже определенного порога в течение определенного периода времени, вы завершаете запись и отправляете ее в службу. Вы можете найти пример здесь.

Более сложные системы используют лучшие эвристические методы, чтобы решить, говорит ли пользователь, например, частота, а также применяют такие вещи, как шумоподавление, другие системы также могут преобразовывать живую речь в текст, когда пользователь говорит как DeepSpeech 2.

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

      import speech_recognition as sr
import threading
import time
from queue import Queue

listen_recognizer = sr.Recognizer()
process_recognizer = sr.Recognizer()

audios_to_process = Queue()

def callback(recognizer, audio_data):
    if audio_data:
        audios_to_process.put(audio_data)

def listen():
    source = sr.Microphone()
    stop_listening = listen_recognizer.listen_in_background(source, callback, 3)
    return stop_listening

def process_thread_func():
    while True:
        if audios_to_process.empty():
            time.sleep(2)
            continue
        audio = audios_to_process.get()
        if audio:
            try:
                text = process_recognizer.recognize_google(audio)
            except:
                pass
            else:
                print(text)

stop_listening = listen()
process_thread = threading.Thread(target=process_thread_func)
process_thread.start()

input()

stop_listening()

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

Другие вопросы по тегам