2016-09-03 3 views
1

私はラズベリーパイの上にそれのメモリに容量の少し大きいを持っている3モデルB、私はコードで直面してる問題がそれを実行しようとした次のコードは、それが時々実行されるということです。オーバーフローのないPyaudioのpythonモジュールを使用してRaspberry Piでオーディオをキャプチャする方法は?

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() 

プログラムはクラッシュし続け、次の例外がスローされます。 OSError:[-9985] Errnoデバイスが使用できません

+0

リンクしたコードはマイクから読み取れません。エラーだけでなく、実際に使用しているコードと完全なログ出力を提供する必要があります。ラズベリーPIのポケットフィックスでは、言語モデルによる大規模な語彙連続音声認識は不可能です。遅すぎます。 –

+0

はい、申し訳ありませんが、質問の投稿を更新しました。 – 0x01Brain

+0

あなたのオーディオ設定がそれをサポートしている場合、44.1khzで録音しようとすることができます。次に、 '-samprate 44100 -nfft 2048'オプションをデコーダ設定に追加する必要があります。あるいは、システム上のpulseaudio/alsa-dmixを適切に設定して、リサンプリングを行うことができます。 –

答えて

1

最初にストリームを開いて閉じてみてください。それでも問題に直面した場合

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) 

その後、キャプチャデバイスを見つける~/.asoundrc

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

でのAlsaプラグインプラグインを試してみてください(サウンドカードは、オーディオ録音のために使用される)とCARD数とDEVICE番号を書き留め。以下の例では両方とも0です。上記のプラグインでCARDとDEVICEの値を置き換えてください。

> arecord -l 

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

今すぐプラグイン意志が

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

などの保存~/.asoundrcファイルを検索し、RPIを再起動します。 次のpythonスクリプトを使用して、新しく作成したデバイスのindexpcm.record)を見つけてください。

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"])) 

それは出力(ここでは9しかし、あなたの場合には、それは異なる場合があります)INDEX

DEVICE: record INDEX: 9 RATE: 48000 

今すぐあなたの主なスクリプトを少し変更します(p.open()input_device_index=9を挿入)

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

そのすべてが、スクリプトをもう一度実行して、問題が解決するかどうかを確認してください。

+0

それは問題を解決しませんでした。 – 0x01Brain

+0

これはうまくいきました。私は正確に何をしましたか、オーディオエンジンを終了し、ユーザーの発言を認識したら発声を終了しなければなりませんでした。 – 0x01Brain

関連する問題