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

Ошибка в библиотеке sounddevice

Максим Жеребцов Ученик (127), открыт 2 недели назад
Столкнулся с проблемой формирования микрофона на python через библиотеку sounddevice.

Ошибка происходит в одном куске кода:

with sd.RawInputStream(samplerate=samplerate, blocksize=16000, device=device[0], channels=1, callback=callback) as stream:

До выполнения данного кода(настройка):

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

Пожалуйста помогите исправить данную ошибку. Также могу сказать что проект у меня на двух устройствах: ПК и ноутбук. На ПК всë отлично, а на ноутбуке уже появляются проблема в формировании микро при том факте что раньше всë работало хорошо и программа считывала голос. Я пробовал менять blocksize, брал разные микро, менял samplerate, давал разрешение проекту на работу с микрофоном, обновлял драйвера, менял device[0] = 1, очень многое перепробовал, но всë бестолку. Помогите пожалуйста, как можно это исправить? Вот мой примерный код:

import sounddevice as sd
import vosk
import queue
import json

q = queue.Queue()
model = vosk.Model('vosk-model')

# Вывод списка доступных устройств для определения индекса нужного микрофона
print(sd.query_devices())

device_index = 1 # Замените на индекс вашего микрофона
samplerate = 44100 # или 48000
blocksize = 4096 # или 2048

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

try:
with sd.RawInputStream(samplerate=samplerate, blocksize=blocksize, device=device_index,
dtype="int16", channels=1, callback=callback) as stream:
recognizer = vosk.KaldiRecognizer(model, samplerate)
while True:
data = q.get()
if recognizer.AcceptWaveform(data):
result = json.loads(recognizer.Result())['text']
print(result)
except Exception as e:
print(f"Произошла ошибка: {e}")


Что выводит: Произошла ошибка: Error opening RawInputStream: Unanticipated host error [PaErrorCode -9999]: 'Системной функции передан неправильный параметр.' [MME error 11]
2 ответа
kakahaochko Ученик (166) 2 недели назад
я сейчас в deepseek все что ты написал, вставил и мне выдало все и исправление, найди также, или кинь тг я тебе сам скину текст
@GLAVQA Профи (575) 2 недели назад
Ошибка `Unanticipated host error [PaErrorCode -9999]` и особенно `MME error 11: 'Системной функции передан неправильный параметр.'` говорит о том, что передаётся некорректный параметр в `sounddevice.RawInputStream`, **чаще всего — неверный `device_index` или неподдерживаемый `samplerate` / `blocksize` для выбранного устройства**.

---

### ? Вот как можно последовательно устранить эту ошибку:

---

## ✅ 1. Проверь, что `device_index` указывает на существующее **входное** устройство

```python
import sounddevice as sd

devices = sd.query_devices()
for idx, dev in enumerate(devices):
print(f"{idx}: {dev['name']} ({'Input' if dev['max_input_channels'] > 0 else 'Output'})")
```

❗ Убедись, что `device_index` указывает на **Input** устройство (с `max_input_channels > 0`).

---

## ✅ 2. Проверь допустимые параметры `samplerate` и `blocksize` для устройства

```python
device_index = 1 # ← убедись, что верно
info = sd.query_devices(device_index, 'input')
print(f"Default sample rate: {info['default_samplerate']}")
```

Затем **установи `samplerate` строго равным `info['default_samplerate']`**:

```python
samplerate = int(info['default_samplerate'])
```

---

## ✅ 3. Проверь, поддерживает ли устройство `blocksize`

Иногда фиксированный `blocksize` вызывает сбой. Попробуй:

```python
blocksize = 0 # пусть система сама выберет оптимальный размер блока
```

---

## ✅ 4. Убедись, что микрофон доступен системе

Иногда Windows отключает микрофон в настройках приватности:

- **Параметры → Конфиденциальность → Микрофон**
- Разреши доступ для приложений и убедись, что Python / консоль / IDE имеет доступ.

---

## ✅ 5. Укажи `hostapi` для Windows

Для устранения `MME error 11`, можешь явно указать хост:

```python
sd.default.hostapi = 1 # WASAPI или 0 для MME, попробуй по очереди
```

---

## ✅ 6. Твой финальный код с учётом выше

```python
import sounddevice as sd
import vosk
import queue
import json

q = queue.Queue()
model = vosk.Model('vosk-model')

# Найти нужное устройство (вручную или автоматически)
device_index = 1 # убедись, что это input-устройство
device_info = sd.query_devices(device_index, 'input')
samplerate = int(device_info['default_samplerate']) # строго из info

sd.default.device = device_index
sd.default.samplerate = samplerate

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

try:
with sd.RawInputStream(
samplerate=samplerate,
blocksize=0, # пусть выберет автоматически
device=device_index,
dtype="int16",
channels=1,
callback=callback
) as stream:
recognizer = vosk.KaldiRecognizer(model, samplerate)
while True:
data = q.get()
if recognizer.AcceptWaveform(data):
result = json.loads(recognizer.Result())['text']
print(result)

except Exception as e:
print(f"Произошла ошибка: {e}")
```

---

## Если не помогает:

1. Проверь в диспетчере устройств, нет ли "неизвестного устройства".
2. Удали и переустанови драйвер аудиоустройства.
3. Проверь в другой IDE (или в терминале).
4. Попробуй указать `sd.default.hostapi = 1` перед запуском (для WASAPI).

---
Надеемся, было полезно. GLAVQA
Похожие вопросы