Nhận dạng âm thanh và từ ngữ cho Android

Hướng dẫn này chỉ cho bạn cách sử dụng TensorFlow Lite với các mô hình máy học dựng sẵn để nhận dạng âm thanh và lời nói trong ứng dụng Android. Các mô hình phân loại âm thanh giống như mô hình được hiển thị trong hướng dẫn này có thể được sử dụng để phát hiện hoạt động, xác định hành động hoặc nhận dạng lệnh thoại.

Bản demo hoạt hình nhận dạng âm thanh Hướng dẫn này chỉ cho bạn cách tải mã ví dụ xuống, tải dự án vào Android Studio và giải thích các phần chính của ví dụ mã để bạn có thể bắt đầu thêm chức năng này vào ứng dụng của riêng mình. Mã ứng dụng ví dụ sử dụng Thư viện tác vụ TensorFlow cho âm thanh , xử lý hầu hết quá trình ghi và xử lý trước dữ liệu âm thanh. Để biết thêm thông tin về cách xử lý trước âm thanh để sử dụng với các mô hình học máy, hãy xem Chuẩn bị và tăng cường dữ liệu âm thanh .

Phân loại âm thanh bằng máy học

Mô hình học máy trong hướng dẫn này nhận dạng âm thanh hoặc từ từ các mẫu âm thanh được ghi bằng micrô trên thiết bị Android. Ứng dụng ví dụ trong hướng dẫn này cho phép bạn chuyển đổi giữa YAMNet/classifier , một mô hình nhận dạng âm thanh và một mô hình nhận dạng các từ nói cụ thể, đã được đào tạo bằng công cụ TensorFlow Lite Model Maker . Mô hình chạy dự đoán trên các clip âm thanh chứa 15600 mẫu riêng lẻ trên mỗi clip và có độ dài khoảng 1 giây.

Ví dụ thiết lập và chạy

Đối với phần đầu tiên của hướng dẫn này, bạn tải mẫu xuống từ GitHub và chạy mẫu bằng Android Studio. Các phần sau của hướng dẫn này khám phá các phần có liên quan của ví dụ để bạn có thể áp dụng chúng cho ứng dụng Android của riêng mình.

Yêu cầu hệ thống

  • Android Studio phiên bản 2021.1.1 (Bumblebee) trở lên.
  • SDK Android phiên bản 31 trở lên
  • Thiết bị Android có phiên bản hệ điều hành tối thiểu là SDK 24 (Android 7.0 - Nougat) đã bật chế độ nhà phát triển.

Lấy mã ví dụ

Tạo một bản sao cục bộ của mã ví dụ. Bạn sẽ sử dụng mã này để tạo một dự án trong Android Studio và chạy ứng dụng mẫu.

Để sao chép và thiết lập mã ví dụ:

  1. Sao chép kho git
    git clone https://github.com/tensorflow/examples.git
    
  2. Bạn có thể tùy ý định cấu hình phiên bản git của mình để sử dụng tính năng kiểm tra thưa thớt để bạn chỉ có các tệp cho ứng dụng mẫu:

    cd examples
    git sparse-checkout init --cone
    git sparse-checkout set lite/examples/audio_classification/android
    

Nhập và chạy dự án

Tạo một dự án từ mã ví dụ đã tải xuống, xây dựng dự án rồi chạy nó.

Để nhập và xây dựng dự án mã ví dụ:

  1. Khởi động Android Studio .
  2. Trong Android Studio, chọn Tệp > Mới > Nhập dự án .
  3. Điều hướng đến thư mục mã ví dụ chứa tệp build.gradle ( .../examples/lite/examples/audio_classification/android/build.gradle ) và chọn thư mục đó.

Nếu bạn chọn đúng thư mục, Android Studio sẽ tạo một dự án mới và xây dựng nó. Quá trình này có thể mất vài phút, tùy thuộc vào tốc độ máy tính của bạn và liệu bạn có sử dụng Android Studio cho các dự án khác hay không. Khi quá trình xây dựng hoàn tất, Android Studio hiển thị thông báo BUILD SUCCESSFUL trong bảng trạng thái Build Output .

Để chạy dự án:

  1. Từ Android Studio, hãy chạy dự án bằng cách chọn Run > Run 'app' .
  2. Chọn một thiết bị Android được đính kèm có micrô để kiểm tra ứng dụng.

Các phần tiếp theo cho bạn thấy những sửa đổi mà bạn cần thực hiện đối với dự án hiện tại của mình để thêm chức năng này vào ứng dụng của riêng bạn, sử dụng ứng dụng mẫu này làm điểm tham chiếu.

Thêm phụ thuộc dự án

Trong ứng dụng của riêng mình, bạn phải thêm các phần phụ thuộc dự án cụ thể để chạy các mô hình máy học TensorFlow Lite và truy cập các chức năng tiện ích giúp chuyển đổi các định dạng dữ liệu tiêu chuẩn, chẳng hạn như âm thanh, thành định dạng dữ liệu tensor mà mô hình bạn đang sử dụng có thể xử lý.

Ứng dụng ví dụ sử dụng các thư viện TensorFlow Lite sau:

Hướng dẫn sau đây cho biết cách thêm các phần phụ thuộc bắt buộc của dự án vào dự án ứng dụng Android của riêng bạn.

Để thêm phụ thuộc mô-đun:

  1. Trong mô-đun sử dụng TensorFlow Lite, hãy cập nhật tệp build.gradle của mô-đun để bao gồm các phần phụ thuộc sau. Trong mã ví dụ, tệp này nằm ở đây: .../examples/lite/examples/audio_classification/android/build.gradle

    dependencies {
    ...
        implementation 'org.tensorflow:tensorflow-lite-task-audio'
    }
    
  2. Trong Android Studio, đồng bộ hóa các phần phụ thuộc của dự án bằng cách chọn: File > Sync Project with Gradle Files .

Khởi tạo mô hình ML

Trong ứng dụng Android, bạn phải khởi tạo mô hình học máy TensorFlow Lite với các tham số trước khi chạy dự đoán bằng mô hình. Các tham số khởi tạo này phụ thuộc vào mô hình và có thể bao gồm các cài đặt như ngưỡng độ chính xác tối thiểu mặc định cho dự đoán và nhãn cho các từ hoặc âm thanh mà mô hình có thể nhận ra.

Mô hình TensorFlow Lite bao gồm tệp *.tflite chứa mô hình. Tệp mô hình chứa logic dự đoán và thường bao gồm siêu dữ liệu về cách diễn giải kết quả dự đoán, chẳng hạn như tên lớp dự đoán. Các tệp mô hình phải được lưu trữ trong thư mục src/main/assets của dự án phát triển của bạn, như trong ví dụ về mã:

  • <project>/src/main/assets/yamnet.tflite

Để thuận tiện và dễ đọc mã, ví dụ khai báo một đối tượng đồng hành xác định cài đặt cho mô hình.

Để khởi tạo mô hình trong ứng dụng của bạn:

  1. Tạo một đối tượng đồng hành để xác định cài đặt cho mô hình:

    companion object {
      const val DISPLAY_THRESHOLD = 0.3f
      const val DEFAULT_NUM_OF_RESULTS = 2
      const val DEFAULT_OVERLAP_VALUE = 0.5f
      const val YAMNET_MODEL = "yamnet.tflite"
      const val SPEECH_COMMAND_MODEL = "speech.tflite"
    }
    
  2. Tạo cài đặt cho mô hình bằng cách xây dựng đối tượng AudioClassifier.AudioClassifierOptions :

    val options = AudioClassifier.AudioClassifierOptions.builder()
      .setScoreThreshold(classificationThreshold)
      .setMaxResults(numOfResults)
      .setBaseOptions(baseOptionsBuilder.build())
      .build()
    
  3. Sử dụng đối tượng cài đặt này để xây dựng đối tượng TensorFlow Lite AudioClassifier có chứa mô hình:

    classifier = AudioClassifier.createFromFileAndOptions(context, "yamnet.tflite", options)
    

Kích hoạt tính năng tăng tốc phần cứng

Khi khởi tạo mô hình TensorFlow Lite trong ứng dụng của mình, bạn nên cân nhắc sử dụng các tính năng tăng tốc phần cứng để tăng tốc độ tính toán dự đoán của mô hình. Các đại biểu TensorFlow Lite là các mô-đun phần mềm giúp tăng tốc việc thực thi các mô hình học máy bằng cách sử dụng phần cứng xử lý chuyên dụng trên thiết bị di động, chẳng hạn như bộ xử lý đồ họa (GPU) hoặc bộ xử lý tensor (TPU). Ví dụ về mã sử dụng Đại biểu NNAPI để xử lý việc tăng tốc phần cứng khi thực thi mô hình:

val baseOptionsBuilder = BaseOptions.builder()
   .setNumThreads(numThreads)
...
when (currentDelegate) {
   DELEGATE_CPU -> {
       // Default
   }
   DELEGATE_NNAPI -> {
       baseOptionsBuilder.useNnapi()
   }
}

Nên sử dụng đại biểu để chạy các mô hình TensorFlow Lite nhưng không bắt buộc. Để biết thêm thông tin về cách sử dụng đại biểu với TensorFlow Lite, hãy xem Đại biểu TensorFlow Lite .

Chuẩn bị dữ liệu cho mô hình

Trong ứng dụng Android, mã của bạn cung cấp dữ liệu cho mô hình để diễn giải bằng cách chuyển đổi dữ liệu hiện có như clip âm thanh thành định dạng dữ liệu Tensor mà mô hình của bạn có thể xử lý. Dữ liệu trong Tensor mà bạn truyền vào mô hình phải có kích thước hoặc hình dạng cụ thể phù hợp với định dạng dữ liệu được sử dụng để huấn luyện mô hình.

Mô hình YAMNet/phân loại và các mô hình lệnh giọng nói tùy chỉnh được sử dụng trong ví dụ mã này chấp nhận các đối tượng dữ liệu Tensor đại diện cho các clip âm thanh một kênh hoặc đơn âm được ghi ở tần số 16kHz trong các clip 0,975 giây (15600 mẫu). Khi chạy dự đoán trên dữ liệu âm thanh mới, ứng dụng của bạn phải chuyển đổi dữ liệu âm thanh đó thành các đối tượng dữ liệu Tensor có kích thước và hình dạng đó. API âm thanh thư viện tác vụ TensorFlow Lite xử lý việc chuyển đổi dữ liệu cho bạn.

Trong mã ví dụ lớp AudioClassificationHelper , ứng dụng ghi lại âm thanh trực tiếp từ micrô của thiết bị bằng cách sử dụng đối tượng Android AudioRecord . Mã sử ​​dụng AudioClassifier để xây dựng và định cấu hình đối tượng đó nhằm ghi lại âm thanh ở tốc độ lấy mẫu phù hợp với mô hình. Mã này cũng sử dụng AudioClassifier để xây dựng đối tượng TensorAudio nhằm lưu trữ dữ liệu âm thanh đã chuyển đổi. Sau đó đối tượng TensorAudio được chuyển đến mô hình để phân tích.

Để cung cấp dữ liệu âm thanh cho mô hình ML:

  • Sử dụng đối tượng AudioClassifier để tạo đối tượng TensorAudio và đối tượng AudioRecord :

    fun initClassifier() {
    ...
      try {
        classifier = AudioClassifier.createFromFileAndOptions(context, currentModel, options)
        // create audio input objects
        tensorAudio = classifier.createInputTensorAudio()
        recorder = classifier.createAudioRecord()
      }
    

Chạy dự đoán

Trong ứng dụng Android, sau khi kết nối đối tượng AudioRecord và đối tượng TensorAudio với đối tượng AudioClassifier, bạn có thể chạy mô hình dựa trên dữ liệu đó để đưa ra dự đoán hoặc suy luận . Mã ví dụ cho hướng dẫn này chạy dự đoán trên các clip từ luồng đầu vào âm thanh được ghi trực tiếp ở tốc độ cụ thể.

Việc thực thi mô hình tiêu tốn nhiều tài nguyên, do đó, điều quan trọng là phải chạy các dự đoán mô hình ML trên một luồng nền riêng biệt. Ứng dụng ví dụ sử dụng đối tượng [ScheduledThreadPoolExecutor](https://developer.android.com/reference/java/util/concurrent/ScheduledThreadPoolExecutor) để tách biệt quá trình xử lý mô hình khỏi các chức năng khác của ứng dụng.

Các mô hình phân loại âm thanh nhận dạng âm thanh có phần đầu và phần cuối rõ ràng, chẳng hạn như từ, có thể đưa ra dự đoán chính xác hơn về luồng âm thanh đến bằng cách phân tích các clip âm thanh chồng chéo. Cách tiếp cận này giúp mô hình tránh được việc thiếu dự đoán cho những từ bị cắt ở cuối clip. Trong ứng dụng ví dụ, mỗi khi bạn chạy dự đoán, mã sẽ lấy clip 0,975 giây mới nhất từ ​​bộ đệm ghi âm và phân tích nó. Bạn có thể làm cho mô hình phân tích các clip âm thanh chồng chéo bằng cách đặt giá trị interval nhóm thực thi luồng phân tích mô hình thành độ dài ngắn hơn độ dài của các clip được phân tích. Ví dụ: nếu mô hình của bạn phân tích các clip 1 giây và bạn đặt khoảng thời gian thành 500 mili giây thì mô hình sẽ phân tích nửa cuối của clip trước đó và 500 mili giây dữ liệu âm thanh mới mỗi lần, tạo ra mức chồng chéo phân tích clip là 50%.

Để bắt đầu chạy dự đoán trên dữ liệu âm thanh:

  1. Sử dụng phương thức AudioClassificationHelper.startAudioClassification() để bắt đầu ghi âm cho mô hình:

    fun startAudioClassification() {
      if (recorder.recordingState == AudioRecord.RECORDSTATE_RECORDING) {
        return
      }
      recorder.startRecording()
    }
    
  2. Đặt tần suất mô hình tạo ra suy luận từ các clip âm thanh bằng cách đặt interval tốc độ cố định trong đối tượng ScheduledThreadPoolExecutor :

    executor = ScheduledThreadPoolExecutor(1)
    executor.scheduleAtFixedRate(
      classifyRunnable,
      0,
      interval,
      TimeUnit.MILLISECONDS)
    
  3. Đối classifyRunnable trong đoạn mã trên thực thi phương thức AudioClassificationHelper.classifyAudio() để tải dữ liệu âm thanh mới nhất có sẵn từ máy ghi và thực hiện dự đoán:

    private fun classifyAudio() {
      tensorAudio.load(recorder)
      val output = classifier.classify(tensorAudio)
      ...
    }
    

Dừng xử lý dự đoán

Đảm bảo mã ứng dụng của bạn ngừng phân loại âm thanh khi Phân đoạn hoặc Hoạt động xử lý âm thanh của ứng dụng mất tiêu điểm. Việc chạy mô hình học máy liên tục có tác động đáng kể đến thời lượng pin của thiết bị Android. Sử dụng phương thức onPause() của hoạt động hoặc đoạn Android được liên kết với phân loại âm thanh để dừng quá trình ghi âm và dự đoán.

Để dừng ghi và phân loại âm thanh:

  • Sử dụng phương thức AudioClassificationHelper.stopAudioClassification() để dừng ghi và thực thi mô hình, như hiển thị bên dưới trong lớp AudioFragment :

    override fun onPause() {
      super.onPause()
      if (::audioHelper.isInitialized ) {
        audioHelper.stopAudioClassification()
      }
    }
    

Xử lý đầu ra mô hình

Trong ứng dụng Android của bạn, sau khi bạn xử lý một đoạn âm thanh, mô hình sẽ tạo ra một danh sách dự đoán mà mã ứng dụng của bạn phải xử lý bằng cách thực thi logic nghiệp vụ bổ sung, hiển thị kết quả cho người dùng hoặc thực hiện các hành động khác. Đầu ra của bất kỳ mô hình TensorFlow Lite nhất định nào đều khác nhau về số lượng dự đoán mà nó tạo ra (một hoặc nhiều) và thông tin mô tả cho mỗi dự đoán. Trong trường hợp các mô hình trong ứng dụng mẫu, dự đoán là danh sách các âm thanh hoặc từ được nhận dạng. Đối tượng tùy chọn AudioClassifier được sử dụng trong ví dụ mã cho phép bạn đặt số lượng dự đoán tối đa bằng phương thức setMaxResults() , như được minh họa trong phần Khởi tạo mô hình ML .

Để có được kết quả dự đoán từ mô hình:

  1. Lấy kết quả của phương thức classify() của đối tượng AudioClassifier và chuyển chúng đến đối tượng người nghe (tham chiếu mã):

    private fun classifyAudio() {
      ...
      val output = classifier.classify(tensorAudio)
      listener.onResult(output[0].categories, inferenceTime)
    }
    
  2. Sử dụng hàm onResult() của trình nghe để xử lý đầu ra bằng cách thực thi logic nghiệp vụ hoặc hiển thị kết quả cho người dùng:

    private val audioClassificationListener = object : AudioClassificationListener {
      override fun onResult(results: List<Category>, inferenceTime: Long) {
        requireActivity().runOnUiThread {
          adapter.categoryList = results
          adapter.notifyDataSetChanged()
          fragmentAudioBinding.bottomSheetLayout.inferenceTimeVal.text =
            String.format("%d ms", inferenceTime)
        }
      }
    

Mô hình được sử dụng trong ví dụ này tạo danh sách dự đoán có nhãn cho âm thanh hoặc từ được phân loại và điểm dự đoán nằm trong khoảng từ 0 đến 1 dưới dạng Float thể hiện độ tin cậy của dự đoán, với 1 là xếp hạng độ tin cậy cao nhất. Nói chung, những dự đoán có số điểm dưới 50% (0,5) được coi là không thuyết phục. Tuy nhiên, cách bạn xử lý các kết quả dự đoán có giá trị thấp tùy thuộc vào bạn và nhu cầu của ứng dụng của bạn.

Sau khi mô hình trả về một tập hợp kết quả dự đoán, ứng dụng của bạn có thể hành động theo những dự đoán đó bằng cách hiển thị kết quả cho người dùng hoặc thực thi logic bổ sung. Trong trường hợp mã ví dụ, ứng dụng liệt kê các âm thanh hoặc từ được xác định trong giao diện người dùng ứng dụng.

Bước tiếp theo

Bạn có thể tìm thêm các mô hình TensorFlow Lite để xử lý âm thanh trên TensorFlow Hub và thông qua trang hướng dẫn về mô hình được đào tạo trước . Để biết thêm thông tin về cách triển khai machine learning trong ứng dụng di động của bạn với TensorFlow Lite, hãy xem Hướng dẫn dành cho nhà phát triển TensorFlow Lite .