57 lines
1.8 KiB
Python
57 lines
1.8 KiB
Python
import os
|
|
import pvporcupine
|
|
import pyaudio
|
|
import struct
|
|
import logging
|
|
from src.pico2wave import Pico2wave
|
|
from src.vosk import Vosk
|
|
import time
|
|
|
|
class Voice_listener():
|
|
|
|
def run(self):
|
|
|
|
porcupine = None
|
|
pa = None
|
|
audio_stream = None
|
|
|
|
try:
|
|
porcupine = self.init_porcupine()
|
|
pa = pyaudio.PyAudio()
|
|
logging.debug("Init audio with rate: %s and frame per buffer: %s" % (porcupine.sample_rate, porcupine.frame_length))
|
|
audio_stream = pa.open(format=pyaudio.paInt16, channels=1, rate=porcupine.sample_rate, input=True, frames_per_buffer=porcupine.frame_length)
|
|
logging.info("I'm listening")
|
|
while True:
|
|
pcm = audio_stream.read(porcupine.frame_length)
|
|
pcm = struct.unpack_from("h" * porcupine.frame_length, pcm)
|
|
result = porcupine.process(pcm)
|
|
if result:
|
|
tts.say("Oui ?")
|
|
time.sleep(1)
|
|
text = stt.listen(audio_stream,porcupine.frame_length)
|
|
tts.say(text)
|
|
except KeyboardInterrupt:
|
|
logging.info('stopping ...')
|
|
finally:
|
|
if porcupine is not None:
|
|
porcupine.delete()
|
|
|
|
if audio_stream is not None:
|
|
audio_stream.close()
|
|
|
|
if pa is not None:
|
|
pa.terminate()
|
|
|
|
def init_porcupine(self):
|
|
return pvporcupine.create( keyword_file_paths=[os.path.join(os.path.dirname(__file__), './data/picovoice.ppn')],sensitivities=[1])
|
|
|
|
|
|
logging.basicConfig(format='[%(levelname)s] [%(asctime)s] %(message)s',level=logging.DEBUG)
|
|
logging.info('Started')
|
|
|
|
bot = Voice_listener()
|
|
stt = Vosk()
|
|
tts = Pico2wave()
|
|
tts.say("Bonjour !")
|
|
bot.run()
|