建立音訊分類基本應用程式

1. 事前準備

TensorFlow 是一種多用途機器學習架構。可用來在雲端的叢集中訓練大型模型,或是在手機等嵌入式系統上執行本機模型。

本程式碼研究室使用 TensorFlow Lite 在 Android 裝置上執行音訊分類模型。

課程內容

  • 如何找到可供預先訓練的機器學習模型。
  • 如何即時對音訊擷取音訊進行分類。
  • 如何使用 TensorFlow Lite 支援資料庫預先處理模型輸入和後序模型輸出內容。
  • 如何使用音訊工作庫執行所有音訊相關工作。

建構項目

這個簡單的音訊辨識應用程式會執行 TensorFlow Lite 音訊辨識模型,以便即時辨識麥克風的音訊

33af0fdb0a027fa8.png

軟硬體需求

  • 最新版本的 Android Studio (4.1.2 以上版本)
  • 在 Android 23 (Android 6.0) 版本中,有 Android 版本的實體 Android 裝置
  • 範例程式碼
  • 關於 Android Kotlin 開發作業的基本知識

2. 取得範例程式碼

下載程式碼

點選下方連結即可下載這個程式碼研究室的所有程式碼:

將下載的 ZIP 檔案解壓縮。這會將根目錄 (odml-pathways) 與所有您需要的資源一起解壓縮。在這個程式碼研究室中,您只需要 audio_classification/codelab1/android 子目錄中的來源即可。

附註:如有需要,您可以複製存放區:

git clone https://github.com/googlecodelabs/odml-pathways.git

audio_classification/codelab1/android 存放區中的 android 子目錄包含兩個目錄:

  • android_studio_folder.pngstarter:以這個程式碼研究室建立的程式碼。
  • android_studio_folder.pngfinal:完成的範例應用程式的程式碼。

匯入入門應用程式

首先,請將入門應用程式匯入 Android Studio。

  1. 開啟 Android Studio,然後選取 [Import Project (Gradle、Eclipse ADT 等)]
  2. 從您先前下載的原始碼中開啟 starter 資料夾 (audio_classification/codelab1/android/starter)。

7c0f27882a2698ac.png

為確保應用程式支援所有依附元件,請在匯入程序完成後將專案與 gradle 檔案同步處理。

  1. 從 Android Studio 工具列選取 [Sync Project with Gradle Files] (使用 Gradle 檔案同步處理專案) (b451ab2d04d835f9.png)。

執行啟動應用程式

您已將專案匯入 Android Studio,那麼您可以第一次執行應用程式了。

透過 USB 將 Android 裝置連接到電腦,然後在 Android Studio 工具列中按一下 [執行] (執行.png)。

5518972c21705945.png

3. 尋找預先訓練模型

如要進行音訊分類,您需要建立一個模型。您可以先使用預先訓練模型,這樣就不需要自行訓練模型。

如要找出預先訓練模型,請使用 TensorFlow Hub (www.tfhub.dev)。

91e39900ff58818c.png

模型是按網域分類。您只需要使用音訊問題網域即可。

9d44d38c297bf3dc.png

您必須為應用程式使用 YAMNet 模型進行事件分類

YAMNet 是音訊事件分類器,它會將音訊波形當做輸入內容,針對 521 種音訊事件的個別預測工作進行獨立預測。

yamnet/classification 模型已轉換成 TensorFlow Lite,並且具備特定 "metadata,方便音訊模型使用 TFLite Task Library,方便在行動裝置上使用模型。

65dc0f610eb27762.png

選擇正確的分頁:TFLite (yamnet/classification/tflite),然後按一下 [Download]。您也可以在畫面底部查看模型的中繼資料。

cfb3cfeb310e1f51.png

這個模型檔案 (lite-model_yamnet_classification_tflite_1.tflite) 將在下一個步驟中使用。

4. 將新模型匯入基本應用程式

第一個步驟是將下載的模型從上一個步驟移到應用程式的素材資源資料夾。

在 Android Studio 的專案專案中,以滑鼠右鍵按一下「assets」資料夾。

7cca2c22ed8cf4c8.png

系統隨即會顯示一個內含選項清單的彈出式視窗。其中一個選項就是在檔案系統中開啟資料夾。在 Mac 上,這會是「在 Finder 中顯示」,在 Windows 中則是「在檔案總管中開啟」,在 Ubuntu 中則為「在檔案中顯示」。找出您的作業系統適用的選項,並予以選取。

95e0eca881d35f6b.png

然後將下載的模型複製到該模型。

完成這個步驟後,請返回 Android Studio,您應該會在 assets 資料夾中看到自己的檔案。

703b1842fb09e893.png

5. 在基礎應用程式上載入新模型

現在,您將按照部分待辦事項,為您在上一個步驟中新增至模型的模型啟用音訊分類功能。

如要輕鬆找出 TODO,請在 Android Studio 中前往選單,然後依序選取 [檢視工具] > [工具視窗] > [待辦事項]。系統隨即會開啟一個清單,按一下該清單即可直接開啟程式碼。

檔案 build.gradle (模組版本) 中會顯示第一項工作。

TODO 1 是添加 Android 依賴所:

implementation 'org.tensorflow:tensorflow-lite-task-audio:0.2.0'

其他程式碼變更則將於 MainActivity生效。

TODO 2.1 會使用變數名稱建立變數,以便在後續步驟中載入變數。

var modelPath = "lite-model_yamnet_classification_tflite_1.tflite"

TODO 2.2 您需定義最低門檻,以便接受模型預測。稍後會用到這個變數。

var probabilityThreshold: Float = 0.3f

TODO 2.3 是您從資產資料夾中載入模型的位置。「音訊工作庫」中定義的 AudioClassifier 類別已準備好載入模型,並提供執行推論所需的所有方法,並且有助於建立錄音工具。

val classifier = AudioClassifier.createFromFile(this, modelPath)

6. 擷取音訊

「Audio Tasks API」提供多種輔助程式方法,可協助您建立正確的模型錄音模型 (例如「取樣率」、「位元率」、「頻道數」)。有了這項功能,您就不必手動尋找,也能建立設定物件。

TODO 3.1:建立張量變數來儲存記錄供推論,並建立錄音工具的格式規格。

val tensor = classifier.createInputTensorAudio()

TODO 3.2:顯示您在上一個步驟中由模型中繼資料定義的錄音工具規格,

val format = classifier.requiredTensorAudioFormat
val recorderSpecs = "Number Of Channels: ${format.channels}\n" +
       "Sample Rate: ${format.sampleRate}"
recorderSpecsTextView.text = recorderSpecs

92e81894674a5b0.png

TODO 3.3:建立錄音工具並開始錄音。

val record = classifier.createAudioRecord()
record.startRecording()

截至目前為止,您的應用程式已經透過手機的麥克風聆聽,但系統仍無法執行任何推論。您會在下一個步驟中解決這個問題。

7. 為模型新增推論

在這個步驟中,您將在應用程式中加入推論程式碼,並顯示在畫面中。程式碼已有半個執行緒,執行頻率為每半秒,而且會執行推論作業。

方法 scheduleAtFixedRate 的參數會在每 500 毫秒的程式碼中,開始等待執行的時間,以及連續執行工作之間的時間長度。

Timer().scheduleAtFixedRate(1, 500) {
...
}

TODO 4.1 加入程式碼以使用模型。首先,將錄音檔載入音訊張量,並將其傳送至分類器:

tensor.load(record)
val output = classifier.classify(tensor)

TODO 4.2 是更好的推論結果,您可以篩選出機率極低的任何分類。這裡會使用先前步驟 (probabilityThreshold) 中建立的變數:

val filteredModelOutput = output[0].categories.filter {
   it.score > probabilityThreshold
}

TODO 4.3:為了簡化閱讀結果,請建立一個包含篩選結果的字串:

val outputStr = filteredModelOutput.sortedBy { -it.score }
   .joinToString(separator = "\n") { "${it.label} -> ${it.score} " }

TODO 4.4 更新 UI。在這個非常簡單的應用程式中,結果只會顯示在 TextView 中。由於分類不屬於主執行緒,因此必須使用處理常式進行這項更新。

runOnUiThread {
   textView.text = outputStr
}

您已加入所有必要程式碼:

  • 從資產資料夾載入模型
  • 以正確的設定建立錄音工具
  • 執行推論
  • 在螢幕上顯示最佳搜尋結果

現在只需測試應用程式。

8. 執行最終應用程式

您已將音訊分類模型整合到應用程式中,因此請讓我們進行測試。

連結您的 Android 裝置,然後按一下 Android Studio 工具列中的 [執行 ( 執行.png)]。

第一次執行時,您必須授予應用程式音訊記錄權限。

授予權限後,應用程式就會在啟動時開啟手機的麥克風。如需測試,請在手機附近說話,因為 YAMNet 偵測到的其中一個類別是語音。測試另一個類別,就是用手指貼齊或拍手。

你也可以嘗試偵測狗的樹皮和多種其他可能的事件 (521)。如需完整清單,請參閱其原始程式碼,或直接使用標籤檔案讀取中繼資料

33af0fdb0a027fa8.png

9. 恭喜!

在本程式碼研究室中,您已學會如何找出預先訓練模型適用的音訊模型,並使用 TensorFlow Lite 將該模型部署到您的行動應用程式。如要進一步瞭解 TFLite,請參考其他 TFLite 範例

報表主題

  • 如何在 Android 應用程式中部署 TensorFlow Lite 模型。
  • 如何搜尋及使用 TensorFlow Hub 中的模型。

後續步驟

  • 使用您自己的資料自訂模型。

瞭解詳情

有任何疑問嗎?

回報問題