alphacep / vosk-api

Offline speech recognition API for Android, iOS, Raspberry Pi and servers with Python, Java, C# and Node
Apache License 2.0
7.57k stars 1.06k forks source link

[WARN] Overflow - reader is not reading fast enough. #1358

Closed munstr closed 1 year ago

munstr commented 1 year ago

Why does this error occur and how to fix it? Thank you in advance

My code main.py: `import os import vosk import pyaudio import openai from gtts import gTTS from io import BytesIO from pydub import AudioSegment from pydub.playback import play import sys import re from commands import command from wakeword import wake_word import yaml from vosk import SetLogLevel

sys.stdout = open('output.txt', 'w')

with open('tokens.yaml', encoding="utf-8") as f: data = yaml.safe_load(f) GPT_TOKEN = data[1].get("ChatGPT")

openai.api_key = GPT_TOKEN

model_path = "C:\Users\lsiba\OneDrive\Desktop\vosk-model-small-ru-0.22" if not os.path.exists(model_path): print("Модель не найдена") sys.exit(1)

model = vosk.Model(model_path)

rec = vosk.KaldiRecognizer(model, 16000)

chunk = 1024 format = pyaudio.paInt16 channels = 1 rate = 16000

p = pyaudio.PyAudio() stream = p.open(format=format, channels=channels, rate=rate, input=True, frames_per_buffer=chunk)

print("Говорите...") messages = [ {"role": "system", "content" : f'Ты являешься голосовым ассистентом Джарвис из фильма\ Железный человек. При ответе овечайте как Джарвиc и обращайся как сэр. В обычном режиме ты работаешь как голосовой ассистент. Если фраза является командой для запуска\ ответь названием приложения и ВСЁ больше ничего не выводи. Обычно команды начинаются на запусти или открой'} ]

a = "" while a != "WAKE": a = wake_word() else: act = True; print("Action True!")

while act == True: data = stream.read(chunk) if len(data) > 0: if rec.AcceptWaveform(data):

Распознанная фраза

        text = rec.FinalResult().strip()

        text = text.replace('[', '').replace(']', '').replace('"', '')\
        .replace("'", '').replace(':', '').replace('text', '')\
        .replace('{', '').replace('}', '').replace('\n', '').strip()
        if not re.match("^[^\s]*$", text):
            print(text)
            messages.append({"role": "user", "content": text})
            print(messages)
            response = openai.ChatCompletion.create(
                model="gpt-3.5-turbo",  
                messages=messages,
            )
            chat_response = response.choices[0].message.content
            print(chat_response)
            resp = ""
            resp = command(text)
            print(resp)
            if resp != "":
                resp = '"' + resp + '"'
                os.system(resp)

            tts = gTTS(text=chat_response, lang='ru')
            mp3_fp = BytesIO()
            tts.write_to_fp(mp3_fp)
            mp3_fp.seek(0)
            audio = AudioSegment.from_file(mp3_fp, format="mp3",\
            ffprobe="C:\\Users\\lsiba\\OneDrive\\Desktop\\CODS\\jarvis\\ffprobe.exe")
            play(audio)
else:
    pass
`

wakeword.py

`import pvporcupine from pvrecorder import PvRecorder import yaml

with open('tokens.yaml', encoding="utf-8") as f: data = yaml.safe_load(f) PICOVOICE_TOKEN = data[0].get("Picovoice")

porcupine = pvporcupine.create( access_key=PICOVOICE_TOKEN, keyword_paths=['C:\Users\lsiba\OneDrive\Desktop\CODS\jarvis\jarvis_windows.ppn'], sensitivities=[1] )

recorder = PvRecorder(device_index=-1, frame_length=512) recorder.start()

def wake_word(): global cont cont = True while cont==True: keyword_index = porcupine.process(recorder.read()) if keyword_index >= 0: cont = False print("WAKE") return "WAKE"`

nshmyrev commented 1 year ago

We also recommend sounddevice instead of pyaudio.

Same as #1357