2017-05-21 38 views
0

私はPythonを使用して、ラズベリーパイのサウンド入力と出力を再生していました。 私の計画は、マイクの入力を読み取り、それを操作し、操作された音声を再生することでした。現時点では、オーディオを読み込んで再生しようとしました。 最後のステップで読み込んだデータをウェーブファイルに書き込んだので、読み込みがうまくいくように見えました。ウェーブファイルはうまく見えました。 しかし、再生はノイズ音だけです。 Waveファイルを再生しても効果があったので、ヘッドセットは問題ありません。 設定や出力形式に問題があると思います。 コード:Alsaaudio録音と再生

import alsaaudio as audio 
import time 
import audioop 


#Input & Output Settings 
periodsize = 1024 
audioformat = audio.PCM_FORMAT_FLOAT_LE 
channels = 16 
framerate=8000 

#Input Device 
inp = audio.PCM(audio.PCM_CAPTURE,audio.PCM_NONBLOCK,device='hw:1,0') 
inp.setchannels(channels) 
inp.setrate(framerate) 
inp.setformat(audioformat) 
inp.setperiodsize(periodsize) 

#Output Device 
out = audio.PCM(audio.PCM_PLAYBACK,device='hw:0,0') 
out.setchannels(channels) 
out.setrate(framerate) 
out.setformat(audioformat) 
out.setperiodsize(periodsize) 


#Reading the Input 
allData = bytearray() 
count = 0 
while True: 
    #reading the input into one long bytearray 
    l,data = inp.read() 
    for b in data: 
     allData.append(b) 

    #Just an ending condition 
    count += 1 
    if count == 4000: 
     break 

    time.sleep(.001) 


#splitting the bytearray into period sized chunks 
list1 = [allData[i:i+periodsize] for i in range(0, len(allData), periodsize)] 

#Writing the output 
for arr in list1: 
    # I tested writing the arr's to a wave file at this point 
    # and the wave file was fine 
    out.write(arr) 

編集:たぶん私はpythonの3

+0

で正常に動作します。 'channel = 1'を設定すると振る舞いは変わりますか? – nucleon

+0

ちょうど1チャンネルで試してみましたが、不幸にもそれはまだ同じです。多分、私はpython 3を使用していることを言及するべきです(質問を編集します) –

+1

aplay/arecord --dump-hw-paramsでサポートされているデバイスパラメータを確認し、aplayを使ってコンソールから直接waveファイルを再生しようとします。 – nucleon

答えて

0

を使用しています私は答えを見つけたことを、言及する必要があります。 audioformat = audio.PCM_FORMAT_FLOAT_LEこのフォーマットは、ヘッドセットで使用されているフォーマットではありません(ちょっと考えずにコピーして貼り付けただけです)。 speaker-testをコンソールで実行すると、マイクのフォーマット(および追加情報)がわかりました。

私のスピーカー形式はS16_LEあるので、コードは16個のチャンネルをオープンする必要はありませんaudioformat = audio.PCM_FORMAT_S16_LE

関連する問題