使用 AudioRecord 和 Beeware 的 Android 手机麦克风示例

问题描述 投票:0回答:1

Beeware 可以从 Python 脚本访问

android.media
MediaPlayer
Media.Recorder
AudioRecord
,我已经成功地使用 Beeware 在 Galaxy23 上播放和录制音频。但是 MediaRecorder 不提供与音频信号处理相关的应用程序所需的 PCM 格式输出。 AudioRecord 能够对 PCM 中的麦克风信号进行采样,但是当我尝试使用
https://developer.android.com/reference/android/media/AudioRecord
使用 numpy 数组与
read(byte[] ...)
dtype=np.int8
读取 PCM 数据帧(根据 AudioRecord 文档
dtype=np.byte
),甚至尝试将
read(float[] ...)
与带有
dtype=np.float32
的 numpy 数组一起使用,我总是得到相同的歧义错误

android.media.AudioRecord.read is ambiguous for arguments (ndarray, int, int): options are int android.media.AudioRecord.read(byte[], int, int), int android.media.AudioRecord.read(short[], int, int)

在我看来,AudioRecord无法将我的numpy数组识别为

byte[]
格式,尽管
np.int8
np.byte
都是有符号字节,因为
byte[]
在java中,甚至无法将其识别为
float[]
格式与
np.float32 
。 有人能帮我找出我所做的事情有什么问题吗?任何提示将不胜感激

我希望能够正确使用 AudioRecord,因为即使将(手机内)MediaRecorder 输出文件转换为 PCM,Beeware 也无法访问我所知的所有第三方音频模块

我包含了相关代码

def record_file(self,widget):
    #Create an AudioRecord object.
    self.source=MediaRecorder.AudioSource.MIC
    self.sampleRate=8000
    self.channel=AudioFormat.CHANNEL_IN_MONO
    self.encoding=AudioFormat.ENCODING_PCM_16BIT
    self.minBufferSize=AudioRecord.getMinBufferSize(self.sampleRate,self.channel,self.encoding)

    self.recorder=AudioRecord(self.source,self.sampleRate,self.channel,self.encoding,self.minBufferSize)
    self.recorder.startRecording()

    # Create a byte array to store the audio data.
    self.byteRate=2*self.sampleRate
    self.readTimePeriod=self.minBufferSize/self.byteRate
    self.readArray=np.zeros(self.minBufferSize,dtype=np.int8)

    while True:
    
        #Wait for the buffer to fill-in
        time.sleep(self.readTimePeriod)

        # Read audio data from the buffer.
        self.bytesRead = self.recorder.read(jarray(jbyte)(self.readArray),self.readArray,0,self.minBufferSize)
        
        # Get the audio data from the byte array.
        self.audioData = self.readArray[:self.bytesRead]
python android audiorecord chaquopy beeware
1个回答
0
投票

Chaquopy 目前在决定使用哪个 Java 重载时不使用 ndarray 的数据类型。这将是一个有用的功能,我创建了 this issues 来跟踪它。

同时,您可以通过手动将 ndarray 转换为 Java 数组来解决这个问题:

from java import jarray, jbyte

audio = np.array(..., dtype=np.int8)
audio_record.read(jarray(jbyte)(audio), ...)

© www.soinside.com 2019 - 2024. All rights reserved.