Невозможно использовать класс Microphone библиотеки python speech_recognition из-за ALSA

Вопрос или проблема

Я пытаюсь написать программу распознавания речи для Raspberry Pi, однако сталкиваюсь с некоторыми проблемами при использовании библиотеки speech_recognition в Python.

Судя по сообщениям об ошибках (они приведены ниже), я думаю, что проблема может быть связана с неправильной звуковой картой, которая используется, однако я могу записывать звук с помощью PyAudio (который, как я думаю, использует класс микрофона) и ‘arecord’.

Ниже приведен код, который я пытаюсь запустить:

import speech_recognition as sr

r = sr.Recognizer()

with sr.Microphone() as source:

    while True:

        audio = r.listen(source)

        try:
            printf("Вы сказали " + r.recognize(audio))
        except LookupError:
            printf("Не удалось понять аудио")

Я внес некоторые изменения в то, какая звуковая карта используется по умолчанию.

Мой файл “/etc/modprobe.d/alsa-base.conf” нетронут и стандартен.

Я создал файл в /home/pi с именем “.asoundrc”, который содержит:

pcm.!default {
     type asym
     playback.pcm "hw:0,0"
     capture.pcm "hw:1,0"
    }

Это позволяет записывать звук с USB-микрофона и воспроизводить его через встроенный разъем для наушников.

Ниже приведено сообщение об ошибке, которое я получил при попытке запустить скрипт на Python:

pi@raspberrypi ~/Desktop $ python speechtester.py
ALSA lib confmisc.c:1286:(snd_func_refer) Не удалось найти определение 'cards.bcm2835.pcm.front.0:CARD=0'
ALSA lib conf.c:4241:(_snd_config_evaluate) функция snd_func_refer вернула ошибку: Нет такого файла или каталога
ALSA lib conf.c:4720:(snd_config_expand) Ошибка оценки: Нет такого файла или каталога
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Неизвестный PCM front
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Неизвестный PCM cards.pcm.rear
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Неизвестный PCM cards.pcm.center_lfe
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Неизвестный PCM cards.pcm.side
ALSA lib confmisc.c:1286:(snd_func_refer) Не удалось найти определение 'cards.bcm2835.pcm.surround40.0:CARD=0'
ALSA lib conf.c:4241:(_snd_config_evaluate) функция snd_func_refer вернула ошибку: Нет такого файла или каталога
ALSA lib conf.c:4720:(snd_config_expand) Ошибка оценки: Нет такого файла или каталога
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Неизвестный PCM surround40
ALSA lib confmisc.c:1286:(snd_func_refer) Не удалось найти определение 'cards.bcm2835.pcm.surround51.0:CARD=0'
ALSA lib conf.c:4241:(_snd_config_evaluate) функция snd_func_refer вернула ошибку: Нет такого файла или каталога
ALSA lib conf.c:4720:(snd_config_expand) Ошибка оценки: Нет такого файла или каталога
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Неизвестный PCM surround41
ALSA lib confmisc.c:1286:(snd_func_refer) Не удалось найти определение 'cards.bcm2835.pcm.surround51.0:CARD=0'
ALSA lib conf.c:4241:(_snd_config_evaluate) функция snd_func_refer вернула ошибку: Нет такого файла или каталога
ALSA lib conf.c:4720:(snd_config_expand) Ошибка оценки: Нет такого файла или каталога
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Неизвестный PCM surround50
ALSA lib confmisc.c:1286:(snd_func_refer) Не удалось найти определение 'cards.bcm2835.pcm.surround51.0:CARD=0'
ALSA lib conf.c:4241:(_snd_config_evaluate) функция snd_func_refer вернула ошибку: Нет такого файла или каталога
ALSA lib conf.c:4720:(snd_config_expand) Ошибка оценки: Нет такого файла или каталога
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Неизвестный PCM surround51
ALSA lib confmisc.c:1286:(snd_func_refer) Не удалось найти определение 'cards.bcm2835.pcm.surround71.0:CARD=0'
ALSA lib conf.c:4241:(_snd_config_evaluate) функция snd_func_refer вернула ошибку: Нет такого файла или каталога
ALSA lib conf.c:4720:(snd_config_expand) Ошибка оценки: Нет такого файла или каталога
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Неизвестный PCM surround71
ALSA lib confmisc.c:1286:(snd_func_refer) Не удалось найти определение 'cards.bcm2835.pcm.iec958.0:CARD=0,AES0=4,AES1=130,AES2=0,AES3=2'
ALSA lib conf.c:4241:(_snd_config_evaluate) функция snd_func_refer вернула ошибку: Нет такого файла или каталога
ALSA lib conf.c:4720:(snd_config_expand) Ошибка оценки: Нет такого файла или каталога
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Неизвестный PCM iec958
ALSA lib confmisc.c:1286:(snd_func_refer) Не удалось найти определение 'cards.bcm2835.pcm.iec958.0:CARD=0,AES0=4,AES1=130,AES2=0,AES3=2'
ALSA lib conf.c:4241:(_snd_config_evaluate) функция snd_func_refer вернула ошибку: Нет такого файла или каталога
ALSA lib conf.c:4720:(snd_config_expand) Ошибка оценки: Нет такого файла или каталога
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Неизвестный PCM spdif
ALSA lib confmisc.c:1286:(snd_func_refer) Не удалось найти определение 'cards.bcm2835.pcm.iec958.0:CARD=0,AES0=4,AES1=130,AES2=0,AES3=2'
ALSA lib conf.c:4241:(_snd_config_evaluate) функция snd_func_refer вернула ошибку: Нет такого файла или каталога
ALSA lib conf.c:4720:(snd_config_expand) Ошибка оценки: Нет такого файла или каталога
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Неизвестный PCM spdif
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Неизвестный PCM cards.pcm.hdmi
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Неизвестный PCM cards.pcm.hdmi
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Неизвестный PCM cards.pcm.modem
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Неизвестный PCM cards.pcm.modem
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Неизвестный PCM cards.pcm.phoneline
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Неизвестный PCM cards.pcm.phoneline
ALSA lib pcm_dmix.c:957:(snd_pcm_dmix_open) Плагин dmix поддерживает только поток воспроизведения
Не удалось подключиться к серверному сокету, ошибка = Нет такого файла или каталога
Не удалось подключиться к каналу запросов сервера
Сервер jack не работает или не может быть запущен

Извините за относительно длинный пост, я просто хотел предоставить как можно больше информации.

Согласно StackOverflow, эти “ошибки” – это просто мусор, выброшенный PortAudio. Я думаю, ваша настоящая ошибка в том, что сервер jack не запущен.

Ответ или решение

Вы сталкиваетесь с несколькими проблемами, при попытке использовать библиотеку speech_recognition на Raspberry Pi, и ошибка, которую вы наблюдаете, связана с ALSA и подключением к серверу JACK, который, как кажется, не работает. Давайте рассмотрим, как вы можете устранить эту проблему.

  1. Проблемы с конфигурацией ALSA: Ваш конфигурационный файл .asoundrc выглядит приемлемо, однако лучше убедиться, что указанные вами устройства действительно существуют. Для этого выполните команду arecord -l, чтобы получить список доступных звуковых устройств. Убедитесь, что hw:1,0 соответствует вашему USB-микрофону.

  2. Проблема с JACK: Ошибка о том, что "jack server is not running", может быть связана с тем, что система пытается использовать сервер JACK для обработки звука. Если у вас нет необходимости в JACK, вы можете отключить его использование. Чтобы убедиться, что ваш код не пытается запускать JACK, можно попробовать следующее:

    • Убедитесь, что JACK не работает на вашем устройстве. Выполните jack_control stop и jack_control exit, если он запущен.
    • Проверьте, что в коде нет ссылок на JACK. Вам может понадобиться использовать параметры для библиотеки speech_recognition, чтобы отключить автоматическое использование JACK.
  3. Настройка звуковых устройств: Попробуйте явно указать устройство, которое вы хотите использовать в вашем коде. Измените строку, где вы создаёте источник микрофона:

    with sr.Microphone(device_index=1) as source:  # Замените 1 на индекс вашего микрофона

    Индекс устройства можно узнать также с помощью команды arecord -l. Убедитесь, что выбранный индекс принадлежит вашему USB-микрофону.

  4. Обновление и установка необходимых библиотек: Убедитесь, что у вас установлены последние версии всех библиотек, которые вы используете. Попробуйте обновить pyaudio, speech_recognition и другие зависимости:

    sudo apt-get update
    sudo apt-get install python3-pyaudio
    pip install --upgrade speechrecognition
  5. Использование ALSA напрямую: Многие пользователи сообщают, что лучше всего работает использование ALSA напрямую. Убедитесь, что в вашей системе корректно работает ALSA, и попробуйте протестировать звук с помощью arecord:

    arecord -D hw:1,0 -f cd test.wav
    aplay test.wav

Если запись и воспроизведение выполняются успешно, это подтверждает, что проблема может быть связана с конфигурацией или неправильным использованием speech_recognition.

  1. Тестирование кода: После внесенных изменений протестируйте ваш код снова:

    import speech_recognition as sr
    
    r = sr.Recognizer()
    
    with sr.Microphone(device_index=1) as source:  # Укажите индекс вашего устройства
        print("Скажите что-нибудь...")
        audio = r.listen(source)
    
        try:
            print("Вы сказали: " + r.recognize_google(audio))
        except sr.UnknownValueError:
            print("Не удалось распознать аудио")
        except sr.RequestError as e:
            print("Не удалось получить результат от сервисов Google Speech Recognition; {0}".format(e))

Если указанные шаги не сняли проблему, возможно, вам понадобится проверить более детальную документацию библиотеки speech_recognition и ALSA на предмет возможных конкретных решений для вашей конфигурации Raspberry Pi и используемого оборудования.

Надеюсь, эти шаги помогут вам решить проблемы с использованием библиотеки speech_recognition. Если у вас есть дальше возникшие вопросы, не стесняйтесь задавать их.

Оцените материал
Добавить комментарий

Капча загружается...