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]
Chaquopy 目前在决定使用哪个 Java 重载时不使用 ndarray 的数据类型。这将是一个有用的功能,我创建了 this issues 来跟踪它。
同时,您可以通过手动将 ndarray 转换为 Java 数组来解决这个问题:
from java import jarray, jbyte
audio = np.array(..., dtype=np.int8)
audio_record.read(jarray(jbyte)(audio), ...)