How to capture audio in Raspberry Pi using Pyaudio python module without overflow?

丶灬走出姿态 提交于 2019-12-08 04:20:05

问题


The following code I tried to run it on Raspberry Pi 3 Model B which has a little big of capacity on it's memory, the problem that I'm facing with the code is that it runs sometimes:

from os import environ, path
import pyaudio
from pocketsphinx.pocketsphinx import *
from sphinxbase.sphinxbase import *

MODELDIR = "../../../model"
DATADIR = "../../../test/data"

config = Decoder.default_config()
config.set_string('-hmm', path.join(MODELDIR, 'en-us/en-us'))
config.set_string('-lm', path.join(MODELDIR, '3199.lm'))
config.set_string('-dict', path.join(MODELDIR, '3199.dic'))
config.set_string('-logfn', '/dev/null')
decoder = Decoder(config)

p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True, frames_per_buffer=1024)
stream.start_stream()

in_speech_bf = False
decoder.start_utt()
while True:
    buf = stream.read(1024)
    if buf:
        decoder.process_raw(buf, False, False)
        if decoder.get_in_speech() != in_speech_bf:
            in_speech_bf = decoder.get_in_speech()
            if not in_speech_bf:
                decoder.end_utt()
                result = decoder.hyp().hypstr

                print 'Result:', result
                if result == 'yes':
                      print 'Do whatever you want'

                decoder.start_utt()
    else:
        break
decoder.end_utt()

The program keep crashing and throws the following exception: OSError: [-9985] Errno Device unavailable


回答1:


First try opening and closing stream.

p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True, frames_per_buffer=1024)
# stream.start_stream()
in_speech_bf = False
decoder.start_utt()
while True:
    if stream.is_stopped():
        stream.start_stream() 
    buf = stream.read(1024)
    if buf:
        stream.stop_stream()
        decoder.process_raw(buf, False, False)

If you still face issue then try Alsa Plug plugin in ~/.asoundrc

pcm.record {
    type plug;
    slave {
        pcm "hw:<CARD>,<DEVICE>"
    }
}

Find out CAPTURE Device (Soundcard used for audio recording) and note down CARD number and DEVICE number. In below example both are 0. Replace CARD and DEVICE value in plugin above.

> arecord -l

**** List of CAPTURE Hardware Devices ****
card 0: Devices [USB Device 2345:3x55], device 0: USB Audio [USB Audio]

Now plugin will looks like

pcm.record {
    type plug;
    slave {
        pcm "hw:0,0"
    }
}

Save ~/.asoundrc file and reboot RPi. Now find out index of newly created device (pcm.record) using following python script.

import pyaudio
po = pyaudio.PyAudio()
for index in range(po.get_device_count()): 
    desc = po.get_device_info_by_index(index)
    if desc["name"] == "record":
        print "DEVICE: %s  INDEX:  %s  RATE:  %s " %  (desc["name"], index,  int(desc["defaultSampleRate"]))

It will output INDEX (9 here but in your case it might be different)

DEVICE: record  INDEX:  9  RATE:  48000 

Now change your main script little bit (insert input_device_index=9 in p.open() )

stream = p.open(format=pyaudio.paInt16, 
                channels=1, 
                rate=16000, 
                input=True, 
                input_device_index=9,
                frames_per_buffer=1024)

Thats all, run your script again, see if issue reolve.



来源:https://stackoverflow.com/questions/39302974/how-to-capture-audio-in-raspberry-pi-using-pyaudio-python-module-without-overflo

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!