Распознование голоса при нажатии на кнопку
У меня есть такой код:
#voice to text beta 1
import speech_recognition as sr
import pyaudio,keyboard
r = sr.Recognizer()
def main():
try: talk()
except(UnboundLocalError):
pass
except(TypeError):
pass
def talk():
global text
text = ''
with sr.Microphone() as sourse:
print('Я вас слушаю: ')
r.adjust_for_ambient_noise(sourse)
audio = r.listen(sourse)
try:text = (r.recognize_google(audio, language="ru-RU")).lower()
except:print("error")
print(text)
keyboard.add_hotkey('p', main)
input()
При его запуске, и нажатии на букву p происходит распознование голоса, но если отпустить кнопку, то все равно оно продолжится пока окончательно не дослушает слово. Как сделать что-бы при нажатии на букву, началось распознование голоса, а при отпускании оно прекращалось?
Ответы (1 шт):
Автор решения: Алексей Осинный
→ Ссылка
Можно взять вот этот код за основу:
import pyaudio
import wave
import audioop
import time
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 16000
RECORD_SECONDS = 10
WAVE_OUTPUT_FILENAME = "output.wav"
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
print("* recording")
frames = []
min_level = 3100#"уровень" громкости ниже которого звучит "тишина"(нужно подбирать под каждый микрофон)
'''
#цикл для проверки уровня(2 - это ширина, можно выбирать 1,2,3,4)
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
print(audioop.max(data,2))
'''
wait_time = time.time() + 3#это время означает, что после наступления "тишины" нужно подождать 3 секунды и завершить запись
wait_timeout = time.time() + 15#это время означает, что общая длительность записи не превышает 15 секунд
while time.time() < wait_time and time.time() < wait_timeout:#сюда вставляются любые условия - нажатие или отжатие клавиш
data = stream.read(CHUNK)#читаю данные с микрофона
frames.append(data)#кидаю их в список
if audioop.max(data,2) > min_level:#пересчитываю условия выполнения цикла в зависимости от уровня громкости
wait_time = time.time() + 3
print("* done recording")
stream.stop_stream()
stream.close()
p.terminate()
#далее этот код сохраняет аудиофайл
wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()