Делаю войс ассистента и выдает ошибку

Всем привет, я только на пути изучения Python, решил сделать голосового ассистента. выдает вот такую вот ошибку Ошибка


Список устройств, я выбрал правильно 1 и 3. Ошибка я понимаю, что динамики не являются устройством ввода, но по гайду делаю и у человека все работают, устройства в таком же порядке. Использую Python 3.9.12


вот код я пробовал в device = sd.default.device = 1, 3 убрать = 1, 3. Значит должно выбрать устройство по умолчанию, не помогло.


import sounddevice as sd
import vosk
from vosk import Model, KaldiRecognizer

q = queue.Queue()

model = vosk.Model('model_small')

device = sd.default.device = 1, 3          # sd.default.device = 1, 3 /////input, output # Устройства, которые использую 1 = Миколфон, 3 Динамики. Выбор по умолчанию
samplerate = int(sd.query_devices(device[1], 'input')['default_samplerate'])
#48000

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

    q.put(bytes(indata))


with sd.RawInputStream(samplerate=samplerate, blocksize = 48000, device=device[1],
            dtype="int16", channels=1, callback=callback):
    # после того, как микро прослушает 48000 сэмплов, их необходмо куда-то передать - 'callback'

    rec = vosk.KaldiRecognizer(model, samplerate)
    while True:
        data = q.get()
        if rec.AcceptWaveform(data):
            print(rec.Result())
        else:
            print(rec.PartialResult())

Ответы (2 шт):

Автор решения: CrazyElf

device у вас кортеж (1, 3). Значит device[1] - это 3. А устройство 3 - это динамики, так что оно правильно ругается. Попробуйте поменять на device[0]:

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

Или в явном виде указать 1 в аргументах:

samplerate = int(sd.query_devices(1, 'input')['default_samplerate'])
→ Ссылка
Автор решения: Артем Герман

Поменяй это:

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

на это:

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

где, 0 означает, что будет использоваться первое значение в device.

A так же замени это:

with sd.RawInputStream(samplerate=samplerate, blocksize = 48000, device=device[1],

на это:

with sd.RawInputStream(samplerate=samplerate, blocksize = 48000, device=device[*0*]
→ Ссылка