我在android中分类音频文件使用现场录音。但我想分类从android内部或外部存储中获取音频文件。这是如何工作的?请帮助我。
我的mainActivity代码如下所示,即->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" />
型
谢谢..请帮助,这个问题的解决对我来说很重要!
2条答案
按热度按时间qcbq4gxm1#
您可以使用
tensorAudio.load(data: FloatArray)
来代替tensorAudio.load(audioRecord: AudioRecord)
。您可以通过阅读文件将内部/外部存储的数据加载到data
变量中,就像在Android中一样。请记住,在这种情况下,您录制的文件应该使用
ENCODING_PCM_FLOAT
进行编码,因此您可能需要调整输入数据以适应此格式。如果您通过MediaRecorder或AudioRecord获取数据,您应该能够在初始化对象时将输出文件格式指定为ENCODING_PCM_FLOAT
。如果您不是,也许你可以浏览声音处理库为您的特定用例,因为我恐怕还没有找到任何选项,以帮助您。如果你能解决这个问题,请考虑在单独的答案中写下你的具体步骤。谢谢!
3lxsmp7m2#
使用谷歌的音频任务库:https://www.tensorflow.org/lite/inference_with_metadata/task_library/audio_classifier
字符串