Ich habe die AudioRecord-Klasse verwendet, um die Audioverarbeitung unter Android durchzuführen. Dies ist ein bisschen wie ein Songwriter, und ich habe auf einige japanische Seiten verwiesen, aber ich befürchte, dass die Spezifikationen viele vage Teile enthalten ...
Es mag schwierig sein, ohne Grundkenntnisse in der Sprachverarbeitung zu verstehen, aber es gibt viele APIs wie "positionNotificationPeriod" und "notificationMarkerPosition", dass Sie nicht verstehen, was anders ist.
Daher werde ich eine Notiz (Code mit Kommentaren) des offiziellen Dokuments und der im lokalen Test untersuchten Spezifikationen hinterlassen.
AudioRecordSample.kt
import android.media.AudioFormat
import android.media.AudioRecord
import android.media.MediaRecorder
import android.util.Log
import kotlin.math.max
/**
*Beispielcode für die AudioRecord-Klasse
*/
class AudioRecordSample {
//Abtastrate(Hz)
//Die gesamte Geräteunterstützungsgarantie beträgt nur 44100
private val samplingRate = 44100
//Bildrate(fps)
//Wie oft möchten Sie Audiodaten pro Sekunde verarbeiten?
//Entscheide selbst
private val frameRate = 10
//1 Bild Audio-Daten(=Kurzwert)Anzahl der
private val oneFrameDataCount = samplingRate / frameRate
//Anzahl der Bytes von Audiodaten in einem Frame(byte)
// Byte = 8 bit, Short =Weil es 16 Bit ist,Doppelter Kurzschluss
private val oneFrameSizeInByte = oneFrameDataCount * 2
//Größe des Audiodatenpuffers(byte)
//Anforderung 1:Muss größer als oneFrameSizeInByte sein
//Anforderung 2:Muss größer sein als das vom Gerät geforderte Minimum
private val audioBufferSizeInByte =
max(oneFrameSizeInByte * 10, //Passend dazu ein Puffer für 10 Frames
android.media.AudioRecord.getMinBufferSize(samplingRate,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT))
fun startRecording() {
//Instanz erstellen
val audioRecord = AudioRecord(
MediaRecorder.AudioSource.MIC, //Audio quelle
samplingRate, //Abtastrate
AudioFormat.CHANNEL_IN_MONO, //Kanaleinstellungen.MONO und STEREO garantieren Unterstützung für alle Geräte
AudioFormat.ENCODING_PCM_16BIT, //PCM16 garantiert Unterstützung für alle Geräte
audioBufferSizeInByte) //Puffer
//Wie viele Sprachdaten sollen verarbeitet werden?( =Anzahl der Daten in einem Frame)
audioRecord.positionNotificationPeriod = oneFrameDataCount
//Zu dem Zeitpunkt, zu dem die hier angegebene Nummer erreicht ist,Anschließend wird onMarkerReached aufgerufen
//Scheint es nicht notwendig für eine normale Streaming-Verarbeitung?
audioRecord.notificationMarkerPosition = 40000 //Nicht einstellen, wenn nicht verwendet.
//Array zum Speichern von Sprachdaten
val audioDataArray = ShortArray(oneFrameDataCount)
//Rückruf angeben
audioRecord.setRecordPositionUpdateListener(object : AudioRecord.OnRecordPositionUpdateListener {
//Verarbeitung für jeden Frame
override fun onPeriodicNotification(recorder: AudioRecord) {
recorder.read(audioDataArray, 0, oneFrameDataCount) //Audiodaten lesen
Log.v("AudioRecord", "onPeriodicNotification size=${audioDataArray.size}")
//Verarbeiten Sie nach Belieben
}
//Marker-Timing-Verarbeitung.
//Wird aufgerufen, wenn notificationMarkerPosition erreicht ist
override fun onMarkerReached(recorder: AudioRecord) {
recorder.read(audioDataArray, 0, oneFrameDataCount) //Audiodaten lesen
Log.v("AudioRecord", "onMarkerReached size=${audioDataArray.size}")
//Verarbeiten Sie nach Belieben
}
})
audioRecord.startRecording()
}
}
Es ist nur einfach. Ich werde es noch einmal schreiben, wenn ich fortgeschrittenere Erkenntnisse wie die Leistung erhalten kann.
Recommended Posts