Tạo một ứng dụng cơ bản để phân loại âm thanh

1. Trước khi bắt đầu

TensorFlow là khung công nghệ máy học đa năng. API này có thể dùng để đào tạo các mô hình khổng lồ trên các cụm trên đám mây hoặc chạy các mô hình cục bộ trên một hệ thống được nhúng như điện thoại.

Lớp học lập trình này sử dụng TensorFlow Lite để chạy mô hình phân loại âm thanh trên thiết bị Android.

Kiến thức bạn sẽ học được

  • Cách tìm một mô hình máy học đã được đào tạo trước để bạn sử dụng.
  • Cách phân loại âm thanh trên âm thanh được ghi lại theo thời gian thực.
  • Cách sử dụng Thư viện hỗ trợ củaTensorFlow Lite để xử lý trước dữ liệu đầu vào của mô hình và đầu ra của mô hình sau xử lý.
  • Cách sử dụng Thư viện nhiệm vụ âm thanh để thực hiện tất cả các công việc liên quan đến âm thanh.

Sản phẩm bạn sẽ tạo ra

Một ứng dụng nhận dạng âm thanh đơn giản chạy mô hình nhận dạng âm thanh TensorFlow Lite để xác định âm thanh từ micrô theo thời gian thực

33af0fdb0a027fa8.png

Bạn cần có

  • Phiên bản Android Studio phiên bản 4.1.2 trở lên gần đây
  • Thiết bị Android thực có phiên bản Android ở API 23 (Android 6.0)
  • Mã mẫu
  • Kiến thức cơ bản về việc phát triển Android trong Kotlin

2. Lấy mã mẫu

Tải mã nguồn xuống

Nhấp vào đường liên kết sau đây để tải toàn bộ mã nguồn cho lớp học lập trình này:

Giải nén tệp zip đã tải xuống. Thao tác này sẽ giải nén thư mục gốc (odml-pathways) chứa tất cả tài nguyên mà bạn cần. Đối với lớp học lập trình này, bạn sẽ chỉ cần các nguồn trong thư mục con audio_classification/codelab1/android.

Lưu ý: Nếu muốn, bạn có thể sao chép kho lưu trữ:

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

Thư mục con android trong kho lưu trữ audio_classification/codelab1/android chứa hai thư mục:

  • android_studio_folder.pngbắt đầu – Bắt đầu bằng mã mà bạn xây dựng dựa trên lớp học lập trình này.
  • android_studio_folder.pngfinal – Mã hoàn tất cho ứng dụng mẫu đã hoàn tất.

Nhập ứng dụng dành cho người mới bắt đầu

Hãy bắt đầu bằng cách nhập ứng dụng dành cho người mới bắt đầu vào Android Studio.

  1. Mở Android Studio và chọn Nhập dự án (Gradle, Eclipse ADT, v.v.)
  2. Mở thư mục starter (audio_classification/codelab1/android/starter) từ mã nguồn mà bạn đã tải xuống trước đó.

7c0f27882a2698ac.png

Để đảm bảo tất cả các phần phụ thuộc đều có sẵn cho ứng dụng của bạn, bạn nên đồng bộ hóa dự án với các tệp gradle khi quá trình nhập hoàn tất.

  1. Chọn Đồng bộ hóa dự án với Tệp Gradle (b451ab2d04d835f9.png) từ thanh công cụ Android Studio.

Chạy ứng dụng dành cho người mới bắt đầu

Sau khi nhập dự án vào Android Studio, bạn có thể chạy ứng dụng lần đầu tiên.

Kết nối thiết bị Android qua USB với máy tính rồi nhấp vào Chạy ( tức thì.png) trên thanh công cụ Android Studio.

5518972c21705945.png

3. Tìm mô hình đã đào tạo trước

Để phân loại âm thanh, bạn sẽ cần một mô hình. Bắt đầu bằng một mô hình được đào tạo trước để bạn không phải tự huấn luyện mô hình đó.

Để tìm các mô hình đã đào tạo trước, bạn sẽ sử dụng TensorFlow Hub ( www.tfhub.dev).

91e39900ff58818c.png

Các mô hình được phân loại theo miền. Miền mà bạn cần ngay bây giờ là từ Miền vấn đề về âm thanh.

9d44d38c297bf3dc.png

Đối với ứng dụng của bạn, bạn sẽ thực hiện việc phân loại sự kiện bằng mô hình YAMNet.

YAMNet là một trình phân loại sự kiện âm thanh lấy dạng sóng âm thanh làm dữ liệu đầu vào và đưa ra dự đoán độc lập cho từng sự kiện âm thanh trong số 521 sự kiện âm thanh.

Mô hình yamnet/class lời đã được chuyển đổi thành TensorFlow Lite và có siêu dữ liệu cụ thể giúp Thư viện nhiệm vụ TFLite dành cho Âm thanh giúp việc sử dụng mô hình này dễ dàng hơn trên thiết bị di động.

65dc0f610eb27762.png

Chọn thẻ phù hợp: TFLite (yamnet/class lời/tflite), và nhấp vào Download (Tải xuống). Bạn cũng có thể xem siêu dữ liệu của mô hình ở dưới cùng.

{4}b3chc310e1f51.png

Tệp mô hình này (lite-model_yamnet_classification_tflite_1.tflite) sẽ được sử dụng trong bước tiếp theo.

4. Nhập mô hình mới vào ứng dụng cơ sở

Bước đầu tiên là di chuyển mô hình đã tải xuống từ bước trước đó sang thư mục tài sản trong ứng dụng của bạn.

Trong Android Studio, trong trình khám phá dự án, hãy nhấp chuột phải vào thư mục tài sản.

7cca2c22ed8cf4c8.png

Bạn sẽ thấy một cửa sổ bật lên chứa danh sách các lựa chọn. Một trong những tệp này sẽ là mở thư mục trong hệ thống tệp của bạn. Trên máy Mac, tính năng này sẽ là Reveal in Finder (Hiển thị trong Trình tìm kiếm). Trên Windows, tính năng này sẽ Open in Explorer (Mở trong Explorer) và trên Ubuntu, Show in Files (Hiển thị trong ứng dụng Files). Tìm chế độ phù hợp với hệ điều hành của bạn và chọn chế độ đó.

95e0eca881d35f6b.png

Sau đó, hãy sao chép mô hình đã tải xuống vào đó.

Sau khi bạn hoàn tất việc này, hãy quay lại Android Studio và bạn sẽ thấy tệp của mình trong thư mục tài sản.

703b1842fb09e893.png

5. Tải mô hình mới trên ứng dụng cơ sở

Bây giờ, bạn sẽ làm theo một số VIỆC CẦN LÀM và bật tính năng phân loại âm thanh với mô hình mà bạn vừa thêm vào dự án ở bước trước đó.

Để dễ dàng tìm thấy VIỆC CẦN LÀM, trong Android Studio, hãy chuyển đến trình đơn: Xem > Công cụ Windows > VIỆC CẦN LÀM. Cửa sổ sẽ mở ra một cửa sổ có danh sách, và bạn chỉ cần nhấp vào cửa sổ đó để chuyển thẳng đến mã.

Trong tệp build.gradle (phiên bản mô-đun), bạn sẽ tìm thấy việc cần làm đầu tiên.

VIỆC CẦN LÀM 1 là thêm các phần phụ thuộc Android:

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

Tất cả những thay đổi còn lại đối với mã sẽ xuất hiện trên MainActivity

VIỆC CẦN LÀM 2.1 tạo biến có tên mô hình để tải trong các bước tiếp theo.

var modelPath = "lite-model_yamnet_classification_tflite_1.tflite"

VIỆC CẦN LÀM 2.2, bạn sẽ xác định ngưỡng tối thiểu để chấp nhận thông tin dự đoán từ mô hình. Biến này sẽ được sử dụng sau.

var probabilityThreshold: Float = 0.3f

VIỆC CẦN LÀM 2.3 là nơi bạn sẽ tải mô hình từ thư mục tài sản. Lớp AudioClassifier đã xác định trong Thư viện nhiệm vụ âm thanh đã được chuẩn bị để tải mô hình, đồng thời cung cấp cho bạn tất cả phương thức cần thiết để chạy dự đoán và cũng giúp tạo Máy ghi âm.

val classifier = AudioClassifier.createFromFile(this, modelPath)

6. Ghi âm

API tác vụ âm thanh có một số phương thức trợ giúp để giúp bạn tạo trình ghi âm với cấu hình phù hợp mà mô hình của bạn mong đợi (ví dụ: Tốc độ lấy mẫu, tốc độ bit, số kênh). Với phương thức này, bạn không cần tìm phương thức này theo cách thủ công mà cũng có thể tạo các đối tượng cấu hình.

VIỆC CẦN LÀM 3.1: Tạo biến tensor sẽ lưu trữ bản ghi để dự đoán và xây dựng quy cách định dạng cho trình ghi.

val tensor = classifier.createInputTensorAudio()

VIỆC CẦN LÀM 3:2: Hiển thị thông số kỹ thuật của trình ghi âm được siêu dữ liệu xác định trong bước trước đó của mô hình.

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

92e81894674a5b0.png

VIỆC CẦN LÀM 3.3: Tạo trình ghi âm và bắt đầu ghi.

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

Hiện tại, ứng dụng của bạn đang lắng nghe trên micrô của điện thoại, nhưng vẫn không suy đoán được. Bạn sẽ giải quyết vấn đề này trong bước tiếp theo.

7. Thêm thông tin dự đoán cho mô hình của bạn

Ở bước này, bạn sẽ thêm mã dự đoán vào ứng dụng và hiển thị mã đó trên màn hình. Mã này đã có một chuỗi đồng hồ hẹn giờ được thực thi sau mỗi nửa giây và đó sẽ là kết quả dự đoán.

Các thông số cho phương thức scheduleAtFixedRate là thời gian chờ để bắt đầu thực thi và thời gian giữa các lần thực thi tác vụ liên tiếp, trong mã bên dưới mỗi 500 mili giây.

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

VIỆC CẦN LÀM 4.1 Thêm mã để sử dụng mô hình. Trước tiên, hãy tải bản ghi âm vào một biến thể âm thanh rồi chuyển bản ghi đó đến bộ phân loại:

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

VIỆC CẦN LÀM 4.2 để có kết quả dự đoán tốt hơn, bạn sẽ lọc ra bất kỳ phân loại nào có xác suất rất thấp. Tại đây, bạn sẽ sử dụng biến được tạo ở bước trước đó (probabilityThreshold):

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

VIỆC CẦN LÀM 4:3: Để việc đọc kết quả dễ dàng hơn, hãy để chúng tôi tạo một Chuỗi với kết quả đã lọc:

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

VIỆC CẦN LÀM 4.4 Cập nhật giao diện người dùng. Trong ứng dụng rất đơn giản này, kết quả chỉ hiển thị trong Chế độ xem văn bản. Vì việc phân loại không nằm trên Chuỗi chính, bạn sẽ cần sử dụng trình xử lý để cập nhật.

runOnUiThread {
   textView.text = outputStr
}

Bạn đã thêm tất cả mã cần thiết để:

  • Tải mô hình từ thư mục tài sản
  • Tạo trình ghi âm có cấu hình chính xác
  • Suy luận đang chạy
  • Hiện kết quả tốt nhất trên màn hình

Hiện tại, tất cả những gì bạn cần làm là thử nghiệm ứng dụng.

8. Chạy ứng dụng cuối cùng

Bạn đã tích hợp mô hình phân loại âm thanh vào ứng dụng, do đó, hãy để bạn thử nghiệm mô hình đó.

Kết nối thiết bị Android của bạn rồi nhấp vào Chạy ( tức thì.png) trên thanh công cụ của Android Studio.

Trong lần thực thi đầu tiên, bạn sẽ cần cấp quyền ghi âm cho ứng dụng.

Sau khi cấp quyền, ứng dụng khi khởi động sẽ sử dụng micrô của điện thoại. Để kiểm tra, hãy bắt đầu nói gần điện thoại vì một trong các lớp học mà YAMNet phát hiện là lời nói. Một cách kiểm tra khác mà bạn có thể dễ dàng thực hiện là giơ ngón tay hoặc vỗ tay.

Bạn cũng có thể thử phát hiện tiếng chó sủa và nhiều sự kiện khác (521). Để xem danh sách đầy đủ, bạn có thể xem mã nguồn hoặc bạn cũng có thể đọc siêu dữ liệu trực tiếp với tệp nhãn

33af0fdb0a027fa8.png

9. Xin chúc mừng!

Trong lớp học lập trình này, bạn đã học cách tìm mô hình đào tạo trước để phân loại âm thanh và triển khai mô hình đó cho ứng dụng của mình bằng TensorFlow Lite. Để tìm hiểu thêm về TFLite, hãy xem các mẫu TFLite khác.

Những điều chúng tôi đã đề cập

  • Cách triển khai mô hình TensorFlow Lite trên ứng dụng Android.
  • Cách tìm và sử dụng mô hình từ TensorFlow Hub.

Bước tiếp theo

  • Tùy chỉnh mô hình bằng dữ liệu của riêng bạn.

Tìm hiểu thêm

Bạn có câu hỏi?

Báo cáo sự cố