Преобразование голоса в текст во время разговора в 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 распознавателя, поэтому один всегда будет слушать, а другой обрабатывать аудиоданные. Первый прослушивает данные, затем добавляет аудиоданные в очередь и снова прослушивает. В то же время другой распознаватель проверяет, есть ли аудиоданные, которые нужно преобразовать в текст, чтобы затем распечатать его.