我正在尝试使用python和pyaudio录制和播放一些音频。 我正在使用连接到树莓派的麦克风,并将C-Media Electronics,Inc。CM108音频控制器设置为默认设备。
此设备仅以单声道录制。
$scope.submitForm = function() {
if ($scope.myForm.$valid) {
alert('Our Form Is Submited....');
}
};
录制代码
0 - USB PnP Sound Device: USB Audio (hw:0,0)
{'defaultSampleRate': 44100.0, 'defaultLowOutputLatency': 0.011609977324263039, 'defaultLowInputLatency': 0.011609977324263039, 'maxInputChannels': 1L, 'structVersion': 2L, 'hostApi': 0L, 'index': 0, 'defaultHighOutputLatency': 0.046439909297052155, 'maxOutputChannels': 2L, 'name': u'USB PnP Sound Device: USB Audio (hw:0,0)', 'defaultHighInputLatency': 0.046439909297052155}
我可以使用aplay来播放它,它显示以下内容
import pyaudio, wave, sys
CHUNK = 8192
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
RECORD_SECONDS = 10
WAVE_OUTPUT_FILENAME = 'Audio_.wav'
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
channels = CHANNELS,
rate = RATE,
input = True,
input_device_index = 0,
frames_per_buffer = CHUNK)
print("* recording")
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(data)
print("* done recording")
stream.stop_stream() # "Stop Audio Recording
stream.close() # "Close Audio Recording
p.terminate() # "Audio System Close
wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()
但是当我尝试使用此代码使用python / pyaudio播放时,我的问题就开始了。
播放代码
Playing WAVE 'Audio_.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Mono
我得到的音频以错误的采样率播放,所以我听起来像是(Alvin和花栗鼠)的东西,并且有很多嗡嗡声/嗡嗡声。 我认为这是因为C-media USB声卡无法播放单声道流。
当使用aplay时,plughw:0,0修复此问题。 我已经将我的.asoundrc设置如下,所以我不必在使用aplay时指定它。
import pyaudio
import wave
import sys
import time
output_device_index = 0
CHUNK = 1024
if len(sys.argv) < 2:
print("Plays a wave file.\n\nUsage: %s filename.wav"
% sys.argv[0])
sys.exit(-1)
wf = wave.open(sys.argv[1], 'rb')
# instantiate PyAudio (1)
p = pyaudio.PyAudio()
def callback(in_data, frame_count, time_info, status):
data = wf.readframes(frame_count)
return (data, pyaudio.paContinue)
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True,
output_device_index=output_device_index,
stream_callback=callback)
data = wf.readframes(CHUNK)
while stream.is_active():
time.sleep(0.1)
stream.stop_stream()
stream.close()
wf.close()
p.terminate()
但是这个dosn在使用python播放音频文件时会有所帮助。 请有人指出我正确的方向。
答案 0 :(得分:2)
您可以尝试将输出流中的通道数设置为两个。然后,您必须每2个字节复制一次。
假设您的宽度是2(16位音频),您从wavfile获得的流(作为字节串)将如下所示:
B1a B1b B2a B2b B3a B3b ... etc
你需要流式传输的是这个(如果你想在两个通道上输出:
B1a B1b B1a B1b B2a B2b B2a B2b B3a B3b B3a B3b
如果您尝试将第一个流传输到立体声设备,它将发出两倍音调,因为偶数样本转到左声道,奇数声道转到右声道,两个声道只获得1/2个样本
答案 1 :(得分:1)
我不知道它是否适用于Pi,但您可以尝试python-sounddevice。