Skip to main content

AndroidのAudioRecordの基本を理解する

 Androidで音声処理をするために、AudioRecordクラスを利用しました。これがいくつかの日本語ページを参照しましたが、どうも仕様に曖昧な部分が多かった。。。
 そもそも音声処理の基本知識がないと理解しづらいのもあると思いますが、positionNotificationPeriodとかnotificationMarkerPositionなどの何が違うのかよくわからないAPIも多いです。ということで、公式ドキュメント及びローカルテストで順調した仕様をメモ(コメント付きのコード)に残します。
・Android API:27 (Anroid 8.1 Oreo)
・Kotlin

import android.media.AudioRecord
import android.media.MediaRecorder
import android.util.Log
import kotlin.math.max /**
* AudioRecord クラスのサンプルコード
*/
class AudioRecordSample { // サンプリングレート (Hz)
// 全デバイスサポート保障は44100のみ
private val samplingRate = 44100 // フレームレート (fps)
// 1秒間に何回音声データを処理したいか
// 各自好きに決める
private val frameRate = 10 // 1フレームの音声データ(=Short値)の数
private val oneFrameDataCount = samplingRate / frameRate // 1フレームの音声データのバイト数 (byte)
// Byte = 8 bit, Short = 16 bit なので, Shortの倍になる
private val oneFrameSizeInByte = oneFrameDataCount * 2 // 音声データのバッファサイズ (byte)
// 要件1:oneFrameSizeInByte より大きくする必要がある
// 要件2:デバイスの要求する最小値より大きくする必要がある
private val audioBufferSizeInByte =
max(oneFrameSizeInByte * 10, // 適当に10フレーム分のバッファを持たせた
android.media.AudioRecord.getMinBufferSize(samplingRate,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT)) fun startRecording() { // インスタンスの作成
val audioRecord = AudioRecord(
MediaRecorder.AudioSource.MIC, // 音声のソース
samplingRate, // サンプリングレート
AudioFormat.CHANNEL_IN_MONO, // チャネル設定. MONO and STEREO が全デバイスサポート保障
AudioFormat.ENCODING_PCM_16BIT, // PCM16が全デバイスサポート保障
audioBufferSizeInByte) // バッファ // 音声データを幾つずつ処理するか( = 1フレームのデータの数)
audioRecord.positionNotificationPeriod = oneFrameDataCount // ここで指定した数になったタイミングで, 後続の onMarkerReached が呼び出される
// 通常のストリーミング処理では必要なさそう?
audioRecord.notificationMarkerPosition = 40000 // 使わないなら設定しない. // 音声データを格納する配列
val audioDataArray = ShortArray(oneFrameDataCount) // コールバックを指定
audioRecord.setRecordPositionUpdateListener(object : AudioRecord.OnRecordPositionUpdateListener { // フレームごとの処理
override fun onPeriodicNotification(recorder: AudioRecord) {
recorder.read(audioDataArray, 0, oneFrameDataCount) // 音声データ読込
Log.v("AudioRecord", "onPeriodicNotification size=${audioDataArray.size}")
// 好きに処理する
} // マーカータイミングの処理.
// notificationMarkerPosition に到達した際に呼ばれる
override fun onMarkerReached(recorder: AudioRecord) {
recorder.read(audioDataArray, 0, oneFrameDataCount) // 音声データ読込
Log.v("AudioRecord", "onMarkerReached size=${audioDataArray.size}")
// 好きに処理する
}
}) audioRecord.startRecording()
}
}
import android.media.AudioFormat

簡単にまとめると、
・samplingRate : サンプリングレート(Hz)。
 全デバイスサポート保障は44100のみ
・frameRate:フレームレート(fps)。
 1秒に何回音声を処理したいか。各自好きに決める。
・oneFrameDataCount:1フレームの音声データ(=Short値)の数
・oneFrameSizeInByte:1フレームの音声データのバイト数(byte)
 Byte = 8 bit, Short = 16 bitなので、Shortの倍になる。
・audioBufferSizeInByte:音声データのバッファサイズ(byte)
 条件1:onFrameSizeInByteより大きくする必要がある。
 条件2:デバイスの要求する最小値より大きくする必要がある

Comments

Popular Posts

7554 bất ngờ mở miễn phí tặng game thủ nhân dịp kỷ niệm 65 năm chiến thắng Điện Biên Phủ

  "Tiến tới kỷ niệm 65 năm chiến thắng Điện Biên Phủ(7/5/1954 - 7/5/2019) . Và cũng nhân dịp kỷ niệm 10 năm làm game của Hiker Games. Như đã hứa, xin được gửi tặng cộng đồng game thủ Việt Nam phiên bản 7554 hoàn toàn miễn phí. Các bạn có thể truy cập vào website http://www.7554.vn để download. Để đảm bảo không có hiểu nhầm nào, xin lưu ý, đây không phải là phiên bản làm lại của 7554.  Đây chỉ là phiên bản đã loại bỏ phần kiểm tra bản quyền để bất cứ ai cũng có thể tải về và trải nghiệm game. Chúc các bạn chơi game vui vẻ!"  Via 7554 Dưới đây là video hướng dẫn tải game:  Chúc các bạn chơi game vui vẻ !

Huobi - Đăng kí ngay để nhận ưu đãi lên đến 170$ khi nạp tiền

Huobi là gì? Huobi là một trong những nền tảng giao dịch tiền ảo khổng lồ của Trung Quốc, trụ sở tại Bắc Kinh. Huobi là một trong những sàn giao dịch phổ biến trong cộng đồng trader Việt. Đáng chú ý là, trong thị trường mà các sàn giao dịch thường xuyên bị hack như hiện nay, Huobi lại chưa từng bị tấn công trong suốt quá trình hoạt động của mình. Đánh giá sàn Huobi Các loại phí trên sàn Huobi Sàn Huobi không thu phí nạp coin. Phí rút sẽ tùy thuộc vào từng loại coin. Huobi tính phí 0.2% trên mỗi giao dịch. Người dùng có thể giảm phí giao dịch bằng cách dùng USDT mua thẻ điểm (Point Card). Point Card thấp nhất có thể chiết khấu thêm 10% phí giao dịch. Ưu điểm của sàn Huobi Sàn Huobi hiện có hơn 500 cặp giao dịch và đang tăng lên từng ngày. Mọi người có thể tìm thấy hầu hết các Altcoin muốn giao dịch trên này. Huobi có hỗ trợ tiếng Việt. Giao diện tiếng Việt của sàn trực quan, dễ sử dụng.  Cộng đồng Huobi Việt đông đảo, nhiều vấn đề của người dùng đều giải quyết được. Sàn Huobi có nhi...

KuCoin - Sàn mua bán tiền mã hóa với mức phí thấp

KuCoin là gì?      Trong các đánh giá sàn KuCoin, nó có vẻ như là một nền tảng trao đổi tiền ảo tuyệt vời.  Cung cấp phí giao dịch thấp Nhiều loại tiền ảo được hỗ trợ Sử dụng đơn giản Giao dịch ẩn danh Bảo mật cao Copy Trade      Một trong những nhược điểm đáng chú ý trong các đánh giá sàn KuCoin là khối lượng giao dịch thấp. Ngoài ra, đã có một số vấn đề được báo cáo trong thời gian lưu lượng truy cập cao. Tuy nhiên, theo các đánh giá sàn KuCoin, ưu điểm nhiều hơn nhược điểm và tôi tin rằng KuCoin đáng để thử. Trải nghiệm của bạn với nó thậm chí có thể trở nên tốt hơn nếu bạn chọn thử một số mã giới thiệu KuCoin. Mã giới thiệu sàn KuCoin      Đăng kí sàn Kucoin bằng link dưới đây để nhận hoàn trả khi giao dịch và nhận nhiều ưu đãi khác. https://www.kucoin.com/ucenter/signup?rcode=rJP2UCV Trong đó mã  rJP2UCV  là mà giới thiệu. Nhập bằng tay nếu mã không tự động nhập.