Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

При работе с pyaudio возникла следующая ошибка OSError: [Errno -9988] Stream closed

Павел Тетюев Ученик (94), на голосовании 1 неделю назад
При работе с pyaudio возникла следующая ошибка OSError: [Errno -9988] Stream closed, помогите разобраться. Вот весь мой код.
`q = queue.Queue()

model = vosk.Model('model_small')

device = sd.default.device

samplerate = int(sd.query_devices(device[0], 'input')['default_samplerate'])

def callback(indata, frames, time, status):

q.put(bytes(indata))
def recognize(data, vectorizer, clf): # получаем вектор полученного текста # сравниваем с вариантами, получая наиболее подходящий ответ
text_vector=vectorizer.transform([data]).toarray()[0]
answer = clf.predict([text_vector])[0]

получение имени функции из ответа из data_set
func_name = answer.split()[0]

озвучка ответа из модели data_set
vois_pyttsx3.speaker(answer.replace(func_name, ''))

запуск функции из skills
exec(func_name + '()')
def maun(): # Создание экземпляра объекта Porcupine с указанием пути к модели активационной фразы porcupine = pvporcupine.create( access_key=words.accessKey, keyword_paths=[words.KEYWORD_PATH], model_path=words.modelPath )

Получение параметров аудиопотока
pa = pyaudio.PyAudio()

Определение параметров аудиопотока
stream = pa.open (
rate=porcupine.sample_rate,
channels=1,
format=pyaudio.paInt16,
input=True,
frames_per_buffer=porcupine.frame_length
)

while True:
pcm= stream.read (porcupine.frame_length
pcm=struct.unpack_from(«h»*porcupine.frame_length, pcm)

# Проверка, входит ли входное аудио в активационную фразу
keyword_index = porcupine.process(pcm)

# Если активационная фраза распознана, произвести нужные действия
if keyword_index >= 0:
print(«Действие, связанное с активационной фразой»)
vois_pyttsx3.speaker('да сэр')
main(pa, stream)
pa.terminate()
def main(pa, stream): vectorizer = CountVectorizer()

vectors = vectorizer.fit _transform(list(words.data_set.keys()))

clf = LogisticRegression()
clf.fit (vectors, list(words.data_set.values()))

del words.data_set

recognizer = vosk.KaldiRecognizer(model, 16000)

print(«Recording...»)
frames = []

for i in range(0, int(16000 / 8000 * 5)): # Запись на 5 секунд
data = stream.read (8000)
frames.append(data)


print(«Recording finished.»)
stream.stop_stream()
stream.close()
pa.terminate()


data = b''.join(frames)
if recognizer.AcceptWaveform(data):
data = json.loads(recognizer.Result())['text']
recognize(data, vectorizer, clf)
if name == 'main': maun() `
Изначально хотел распознавать активационную фразу в функции maun, а в функции main записывать голос отрывками по пять секунд с дальнейшей обработкой. и первую команду все работает хорошо, но потом нет
Голосование за лучший ответ
Леха Миронов Мастер (2013) 1 месяц назад
 import queue 
import sounddevice as sd
import vosk
import pyaudio
import struct
import pyttsx3
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.linear_model import LogisticRegression
import json

q = queue.Queue()
model = vosk.Model('model_small')
device = sd.default.device
samplerate = int(sd.query_devices(device[0], 'input')['default_samplerate'])

def callback(indata, frames, time, status):
q.put(bytes(indata))

def recognize(data, vectorizer, clf):
text_vector = vectorizer.transform([data]).toarray()[0]
answer = clf.predict([text_vector])[0]
func_name = answer.split()[0]
pyttsx3.speak(answer.replace(func_name, ''))
exec(func_name + '()')

def maun():
porcupine = pvporcupine.create(access_key=words.accessKey, keyword_paths=[words.KEYWORD_PATH], model_path=words.modelPath)
pa = pyaudio.PyAudio()
stream = pa.open(
rate=porcupine.sample_rate,
channels=1,
format=pyaudio.paInt16,
input=True,
frames_per_buffer=porcupine.frame_length
)
while True:
pcm = stream.read(porcupine.frame_length)
pcm = struct.unpack_from('h'*porcupine.frame_length, pcm)
keyword_index = porcupine.process(pcm)
if keyword_index >= 0:
print("Действие, связанное с распознанным ключевым словом")
pyttsx3.speak('Yes, sir')
main(pa, stream)
pa.terminate()

def main(pa, stream):
vectorizer = CountVectorizer()
vectors = vectorizer.fit_transform(list(words.data_set.keys()))
clf = LogisticRegression()
clf.fit(vectors, list(words.data_set.values()))
del words.data_set
recognizer = vosk.KaldiRecognizer(model, 16000)
print("Запись...")
frames = []
for i in range(0, int(16000 / 8000 * 5)):
data = stream.read(8000)
frames.append(data)
print("Запись закончена.")
stream.stop_stream()
stream.close()
pa.terminate()
data = b''.join(frames)
if recognizer.AcceptWaveform(data):
data = json.loads(recognizer.Result())['text']
recognize(data, vectorizer, clf)
if name == 'main':
maun()
Павел ТетюевУченик (94) 1 месяц назад
Я попробовал использовать ваш код, но ошибка остаётся, как её можно исправить, и из-за чего она возникает?
Похожие вопросы