如何在Android中进行音频分类以提供输入音频文件



我在android中使用实时录制对音频文件进行分类。但我想分类从android内部或外部存储获取音频文件。这是怎么回事?请帮帮我。

下面给出了我的mainActivity代码,它们是->主活动.kt

package com.example.mysoundclassification
import android.Manifest
import android.os.Bundle
import android.util.Log
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import org.tensorflow.lite.task.audio.classifier.AudioClassifier
import java.util.*
import kotlin.concurrent.scheduleAtFixedRate

class MainActivity : AppCompatActivity() {
var probabilityThreshold: Float = 0.3f
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val showResult = findViewById<TextView>(R.id.output)
//Permission For Record
val REQUEST_RECORD_AUDIO = 1337
requestPermissions(arrayOf(Manifest.permission.RECORD_AUDIO), REQUEST_RECORD_AUDIO)
//Load TFLite model
val audioClassifier = AudioClassifier.createFromFile(this, "my_birds_model.tflite")
//Real Time Audio Record
val audioRecord = audioClassifier.createAudioRecord()
audioRecord.startRecording()
//Use Thread
Timer().scheduleAtFixedRate(1, 1000) {
//Classify Sound
val  tensorAudio= audioClassifier.createInputTensorAudio()
tensorAudio.load(audioRecord)/** Here,Pass live Record audio data.But,
** I want pass here my audio file.
** How do this work??
** Please help me.
*/
//Result
val output = audioClassifier.classify(tensorAudio)
//*** Start Specifying output....
//  Check if it's a bird sound.
var filteredModelOutput = output[0].categories.filter {
it.label.contains("Bird") && it.score > probabilityThreshold
}
//  given there's a bird sound, which one is it?
if (filteredModelOutput.isNotEmpty()) {
Log.i("Yamnet", "bird sound detected!")
filteredModelOutput = output[1].categories.filter {
it.score > probabilityThreshold
}
}
val outputStr = filteredModelOutput.sortedBy { -it.score }
.joinToString(separator = "n") { "${it.label} -> ${it.score} " }
if (outputStr.isNotEmpty())
runOnUiThread {
showResult.text = outputStr
}
Log.i("output", ""+output[0])
//*** End Specifying output
}//End thread
}//End onCreate method
}//End MainActivity

现在下一个代码是xml文件,它们是->activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/output"
android:layout_width="299dp"
android:layout_height="105dp"
android:gravity="center"
android:lines="5"
android:text="Play your audio!"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.424" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Recording"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
app:layout_constraintBottom_toTopOf="@+id/output"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.194" />

</androidx.constraintlayout.widget.ConstraintLayout>

此作品需要获得音频记录权限->权限

<uses-permission android:name="android.permission.RECORD_AUDIO" />

谢谢。。请帮忙,这个问题的解决对我来说非常重要!!!

您可以类似地使用tensorAudio.load(data: FloatArray),而不是使用tensorAudio.load(audioRecord: AudioRecord)。您可以像在Android中一样,通过读取文件将数据从内部/外部存储加载到data变量中。

请记住,在这种情况下,您录制的文件应该使用ENCODING_PCM_FLOAT进行编码,因此您可能需要调整输入数据以适应这种格式。如果您通过MediaRecorder或AudioRecord获取数据,则在初始化对象时应能够将输出文件格式指定为ENCODING_PCM_FLOAT。如果你不是,也许你可以浏览特定用例的声音处理库,因为恐怕我没有找到任何选项来帮助你。

如果你设法解决了问题,请考虑在单独的答案中写下你的具体步骤。谢谢

最新更新