tensorflow 如何在Android音频分类给予输入音频文件?

yduiuuwa  于 6个月前  发布在  Android
关注(0)|答案(2)|浏览(100)

我在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" />


谢谢..请帮助,这个问题的解决对我来说很重要!

qcbq4gxm

qcbq4gxm1#

您可以使用tensorAudio.load(data: FloatArray)来代替tensorAudio.load(audioRecord: AudioRecord)。您可以通过阅读文件将内部/外部存储的数据加载到data变量中,就像在Android中一样。
请记住,在这种情况下,您录制的文件应该使用ENCODING_PCM_FLOAT进行编码,因此您可能需要调整输入数据以适应此格式。如果您通过MediaRecorder或AudioRecord获取数据,您应该能够在初始化对象时将输出文件格式指定为ENCODING_PCM_FLOAT。如果您不是,也许你可以浏览声音处理库为您的特定用例,因为我恐怕还没有找到任何选项,以帮助您。
如果你能解决这个问题,请考虑在单独的答案中写下你的具体步骤。谢谢!

3lxsmp7m

3lxsmp7m2#

使用谷歌的音频任务库:https://www.tensorflow.org/lite/inference_with_metadata/task_library/audio_classifier

// Initialization
AudioClassifierOptions options =
    AudioClassifierOptions.builder()
        .setBaseOptions(BaseOptions.builder().useGpu().build())
        .setMaxResults(1)
        .build();
AudioClassifier classifier =
    AudioClassifier.createFromFileAndOptions(context, modelFile, options);

// Start recording
AudioRecord record = classifier.createAudioRecord();
record.startRecording();

// Load latest audio samples
TensorAudio audioTensor = classifier.createInputTensorAudio();
audioTensor.load(record);

// Run inference
List<Classifications> results = audioClassifier.classify(audioTensor);

字符串

相关问题