【问题标题】:Raspberry pi I2S MEMS Microphone Right CHN Mono Using pyaudio树莓派 I2S MEMS 麦克风右 CHN 单声道使用 pyaudio
【发布时间】:2019-02-10 10:44:24
【问题描述】:

我正在使用 Adafruit I2S MEMS Microphone Breakout 进行录音。参考。 https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout?view=all

当我按照下图将 Mic 连接到 Mono 配置中的 RPI 时,我可以使用 arecord 命令和下面的 python 代码录制音频

arecord -D dmic_sv -c2 -r 48000 -f S32_LE -t wav -V mono -v recording.wav

Python代码sn-p:

channels=1, rate=48000, frames_per_buffer=2400

def start_recording(self):
        try:
            self.logger.info("start_recording()> enter")
            # Use a stream with a callback in non-blocking mode
            self._stream = self._pa.open(format=pyaudio.paInt32,
                                            channels=self.channels,
                                            rate=self.rate,
                                            input=True,
                                            frames_per_buffer=self.frames_per_buffer,
                                            stream_callback=self.get_callback())
            self._stream.start_stream()
            self.logger.info("start_recording()> exit")
            return self
        except Exception, e:
            self.logger.error("start_recording()>", exc_info = True)

但如果我将通道选择引脚连接到逻辑高压,我可以使用 arecord 命令录制音频,但无法使用 python 代码进行录制。 录制右声道单声道音频需要对 python 代码进行任何更改吗?

【问题讨论】:

    标签: python raspberry-pi3 microphone pyaudio digital


    【解决方案1】:

    我做了类似的事情,但使用了python-sounddevice。这是我的repo

    编辑: 这里是具体的录音类进行说明

    import threading
    import queue
    import numpy
    import sounddevice as sd
    import soundfile as sf
    
    class AudioRecorder():
    
        def __init__(self):
    
            self.open = True
            self.file_name = 'name_of_file.wav'
            self.channels = 1
            self.q = queue.Queue()
    
            # Get samplerate
            device_info = sd.query_devices(2, 'input')
            self.samplerate = int(device_info['default_samplerate'])
    
        def callback(self, indata, frames, time, status):
    
            # This is called (from a separate thread) for each audio block.
            if status:
                print(status, file=sys.stderr)
            self.q.put(indata.copy())
    
        def record(self):
            with sf.SoundFile(self.file_name, mode='x', samplerate=self.samplerate, channels=self.channels) as file:
                with sd.InputStream(samplerate=self.samplerate, channels=self.channels, callback=self.callback):
    
                    while(self.open == True):
                        file.write(self.q.get())
    

    编辑 2:代码是一个 Python 类,它使用类似于问题中显示的图像的 I2S 麦克风创建音频文件。当self.open 的值为真时,sounddevice 会将音频数据写入队列(def callback),然后将数据写入文件。您只需切换self.open 即可开始和停止录制。

    【讨论】:

    • 感谢 Kyle 接受之前的反馈并将链接中的代码提供给答案。现在为了使这个答案成为一个好的答案,如果您可以对代码提供一些解释,以帮助未来的读者,那就太好了:)。 (此外,您的某些格式似乎有些偏差)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多