【问题标题】:How to Audio Classification in Android give input Audio file?如何在 Android 中进行音频分类给输入音频文件?
【发布时间】:2021-11-26 05:21:06
【问题描述】:

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

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

【问题讨论】:

    标签: android tensorflow kotlin audio classification


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-24
      • 2014-02-13
      • 2014-05-06
      相关资源
      最近更新 更多