Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android SDK
Code

Tạo một Ứng dụng Thông minh Với Google Cloud Speech và Natural Language API

by
Difficulty:IntermediateLength:LongLanguages:

Vietnamese (Tiếng Việt) translation by Dai Phong (you can also view the original English article)

Một ứng dụng thật sự hiểu được một ngôn ngữ tự nhiên là một thứ gì đó mà những người đam mê khoa học viễn tưởng, lập trình viên và các nhà nghiên cứu về AI đã mơ ước trong nhiều thập kỷ. Ngày nay, nhờ những tiến bộ lớn trong công nghệ máy học (hay còn gọi là machine learning), ước mơ đó đã gần hơn với hiện thực hơn bao giờ hết. Hơn nữa, dịch vụ dựa trên đám mây như Google Cloud Machine Learning đã làm cho những công nghệ đó trở nên miễn phí để cho bất kỳ ai cũng có thể sử dụng.

Trong hướng dẫn này, bạn sẽ học cách sử dụng hai API hướng ngôn ngữ tự nhiên và mạnh mẽ được cung cấp bởi nền tảng Google Cloud Machine Learning: Cloud Speech APICloud Natural Language API. Bằng cách kết hợp chúng lại với nhau, bạn có thể tạo ra các ứng dụng có thể xử lý giọng nói trong nhiều ngôn ngữ khác nhau và được sử dụng rộng rãi.

Yêu cầu

Để thực hiện theo, bạn sẽ cần:

  • Android Studio 2.2 trở lên
  • Một tài khoản Google Cloud Platform
  • một thiết bị chạy Android 4.4 trở lên

1. Tại sao nên sử dụng những API này?

Một ứng dụng có thể xử lý giọng nói phải có các khả năng sau:

  • Nó phải có khả năng trích xuất các từ riêng lẻ từ dữ liệu âm thanh thô.
  • Nó phải có khả năng đưa ra các phỏng đoán có học thức về mối quan hệ ngữ pháp giữa các từ đã trích ra.

Các API Cloud Speech và Cloud Natural Language cho phép bạn thêm các khả năng nêu trên vào ứng dụng Android của bạn chỉ trong vòng vài phút.

Cloud Speech API đóng vai trò như là một công cụ nhận dạng giọng nói hiện đại nhất có thể chuyển giọng nói thành phụ đề một cách chính xác trong hơn 80 ngôn ngữ. Nó cũng có thể xử lý ngữ điệu vùng miền và trong những điều kiện ồn ào rất mạnh mẽ.

Một lưu ý tương tự, Cloud Natural Language API là một hệ thống xử lý ngôn ngữ có khả năng, với mức độ độ chính xác gần giống với con người, xác định được vai trò của các từ trong câu được đưa ra. Nó hiện hỗ trợ mười ngôn ngữ, và nó còn cung cấp các phân tích thực thể và biểu cảm.

2. Kích hoạt các API

Trước khi bạn sử dụng các API Speech và Natural Language, bạn phải kích hoạt chúng trong Google Cloud console. Vì vậy hãy đăng nhập vào console và điều hướng đến API Manager > Library.

Cloud console library

Để kích hoạt Speech API, hãy nhấp vào liên kết Speech API trong khu vực Google Cloud Machine Learning. Trong trang mở ra tiếp theo, hãy nhấn vào nút Enable.

Enabling Cloud Speech API

Nhấn vào nút back của trình duyệt để trở về trang vừa rồi.

Lần này, kích hoạt Natural Language API bằng cách nhấp vào liên kết Natural Language API và nhấn nút Enable trên trang tiếp theo.

Enabling Cloud Natural Language API

Bạn sẽ cần một khóa API khi tương tác với các API. Nếu bạn vẫn chưa có, hãy mở tab Credentials, nhấn vào nút Create credentials và chọn API key.

Bây giờ bạn sẽ thấy một cửa sổ bật lên hiển thị khóa API của bạn. Ghi chú nó lại để bạn có thể sử dụng nó sau này.

API key generated

3. Cấu hình Dự án

Cả hai API này đều dựa trên JSON và có các REST endpoint mà bạn có thể tương tác trực tiếp với chúng bằng bất kỳ thư viện kết nối mạng nào. Tuy nhiên, bạn có thể tiết kiệm được rất nhiều thời gian—và đồng thời viết code dễ đọc hơn—bằng cách sử dụng thư viện Google API Client có sẵn cho chúng. Vì vậy hãy mở tập tin build.gradle trong mô-đun app của dự án và thêm các phụ thuộc compile sau đây vào nó:

Ngoài ra, chúng ta sẽ thực hiện một vài hoạt động I/O trên tập tin trong hướng dẫn này. Để đơn giản hóa chúng, hãy thêm một phụ thuộc compile cho thư viện Commons IO.

Cuối cùng, đừng quên yêu cầu cấp quyền INTERNET trong tập tin AndroidManifest.xml. Nếu không, ứng dụng của bạn sẽ không thể kết nối với máy chủ của Google.

4. Sử dụng Cloud Speech API

Tất nhiên Cloud Speech API nhận dữ liệu âm thanh như là một trong các đầu vào của nó. Do đó, bây giờ chúng ta sẽ tạo một ứng dụng Android có thể trích xuất phụ đề từ tập tin âm thanh.

Để cho đơn giản, chúng ta sẽ chỉ trích xuất các tập tin FLAC, các tập tin này sử dụng định dạng mã hóa Free Lossless Audio Codec. Bạn có thể đã có các tập tin như vậy ở trên thiết bị của mình. Nếu không, tôi đề nghị bạn tải về một vài tập tin từ Wikimedia Commons.

Bước 1: Tạo Bố cục

Bố cục của ứng dụng sẽ có một thành phần Button mà người dùng có thể nhấn vào để hiển thị một File Picker để chọn tập tin, một giao diện mà họ có thể duyệt qua và chọn các tập tin âm thanh hiện có trên các thiết bị của họ.

Bố cục cũng sẽ có một thành phần TextView để hiển thị phụ đề của tập tin âm thanh đã chọn. Theo đó, hãy thêm code sau đây vào tập tin bố cục XML cho activity của bạn:

Bước 2: Tạo một File Picker

Giao diện của File Picker sẽ được hiển thị khi người dùng nhấn vào nút mà chúng ta đã tạo ra ở bước trước đó, vì vậy hãy liên kết một đối tượng OnClickListener với nó. Trước khi bạn làm như vậy, hãy chắc chắn rằng bạn khởi tạo nút bằng phương thức findViewById().

Với Storage Access Framework của Android, một framework có sẵn trên các thiết bị chạy API level 19 hoặc cao hơn, việc tạo một File Picker sẽ mất rất ít công sức. Tất cả những gì bạn cần làm là tạo một intent cho hành động ACTION_GET_CONTENT và truyền nó vào phương thức startActivityForResult(). Ngoài ra, bạn có thể giới hạn cho File Picker chỉ hiển thị các tập tin FLAC bằng cách truyền kiểu MIME thích hợp vào phương thức setType() của đối tượng Intent.

Đầu ra của File Picker sẽ là một đối tượng Intent khác có chứa URI của tập tin mà người dùng đã chọn. Để có thể truy cập vào nó, bạn phải override phương thức onActivityResult() của lớp Activity.

Bước 3: Mã hóa Tập tin

Cloud Speed API yêu cầu ​​dữ liệu âm thanh của nó phải ở dạng chuỗi Base64. Để tạo ra một chuỗi như vậy, bạn có thể đọc nội dung của tập tin mà người dùng đã chọn vào một mảng byte và truyền nó vào phương thức tiện ích encodeBase64String() được cung cấp bởi thư viện Google API Client.

Tuy nhiên, bạn hiện chỉ có URI của tập tin đã được chọn chứ không phải là đường dẫn tuyệt đối. Điều đó có nghĩa là, để có thể đọc tập tin, bạn trước tiên phải phân giải URI. Bạn có thể làm điều đó bằng cách chuyển nó vào phương thức openInputStream() của content resolver trong activity của bạn. Một khi bạn đã truy cập vào input stream của tập tin, bạn chỉ cần truyền nó vào phương thức toByteArray() của lớp IOUtils để chuyển đổi nó thành một mảng các byte. Đoạn code sau đây sẽ cho bạn thấy điều đó:

Như bạn có thể thấy, trong đoạn code ở trên, chúng ta đang sử dụng một thread mới để chạy tất cả các hoạt động I/O. Đó là điều quan trọng để đảm bảo giao diện người dùng của ứng dụng không bị đứng.

Bước 4: Phát Tập tin

Theo tôi, phát tập tin âm thanh khi đang trích xuất phụ đề là một ý tưởng tốt. Nó không mất nhiều công sức, và nó cải thiện trải nghiệm người dùng.

Bạn có thể sử dụng lớp MediaPlayer để phát tập tin âm thanh. Một khi bạn trỏ nó đến URI của tập tin bằng phương thức setDataSource() của nó, bạn phải gọi phương thức prepare() của nó để đồng bộ hoá quá trình chuẩn bị cho máy phát nhạc. Khi máy phát đã sẵn sàng, bạn có thể gọi phương thức start() của nó để bắt đầu phát tập tin.

Ngoài ra, bạn phải nhớ giải phóng tài nguyên của máy phát một khi nó đã phát tập tin xong. Để làm như vậy, hãy gán một đối tượng OnCompletionListener cho nó và gọi phương thức release() của nó. Đoạn code sau sẽ minh hoạ điều đó:

Bước 5: Đồng bộ hóa Phụ đề

Tại thời điểm này, chúng ta có thể gửi dữ liệu âm thanh đã được mã hóa Base64 cho Cloud Speech API để trích xuất phụ đề. Nhưng trước tiên, tôi đề nghị bạn lưu khóa API mà bạn đã tạo ra trước đó như là một biến thành viên của lớp Activity của bạn.

Để có thể giao tiếp với Cloud Speech API, bạn phải tạo một đối tượng Speech bằng một đối tượng Speech.Builder. Căn cứ vào các đối số, hàm xây dựng của nó nhận HTTP transport và một JSON factory. Ngoài ra, để đảm bảo rằng khóa API được bao gồm trong mọi yêu cầu HTTP gửi đến API, bạn phải liên kết một đối tượng SpeechRequestInitializer với builder và truyền khoá vào nó.

Đoạn code sau tạo ra một đối tượng Speech với lớp AndroidJsonFactory như là JSON factory và lớp NetHttpTransport như là HTTP transport:

Cloud Speech API cần phải được biết tập tin âm thanh chứa ngôn ngữ nào. Bạn có thể làm điều đó bằng cách tạo một đối tượng RecognitionConfig và gọi phương thức setLanguageCode() của nó. Đây là cách bạn cấu hình nó để chỉ trích xuất phụ đề tiếng Anh giọng Mỹ:

Ngoài ra, chuỗi mã hóa Base64 phải được bọc trong một đối tượng RecognitionAudio trước khi nó có thể được sử dụng bởi API.

Tiếp theo, sử dụng các đối tượng RecognitionConfigRecognitionAudio, bạn phải tạo một đối tượng SyncRecognizeRequest. Như gợi ý từ tên của nó, nó cho phép bạn tạo ra một yêu cầu HTTP để đồng bộ hóa dữ liệu phụ đề và âm thanh. Một khi đối tượng đã được tạo ra, bạn có thể truyền nó như là một đối số vào phương thức syncrecognize() và gọi phương thức execute() của đối tượng Speech.SpeechOperations.Syncrecognize để thực hiện yêu cầu HTTP thật sự.

Giá trị trả về của phương thức execute() là một đối tượng SyncRecognizeResponse, đối tượng mà có thể chứa một số lựa chọn phụ đề. Bây giờ, chúng ta sẽ chỉ sử dụng lựa chọn đầu tiên.

Cuối cùng, để hiển thị phụ đề cho người dùng, bạn có thể truyền nó vào thành phần TextView. Tất nhiên, vì các thay đổi trên giao diện người dùng phải luôn luôn xảy ra trên UI thread, nên hãy đảm bảo rằng bạn làm như vậy sau khi gọi phương thức runOnUiThread() của activity của bạn.

Giờ đây, bạn có thể chạy ứng dụng của mình, chọn tập tin FLAC có chứa giọng bằng tiếng Anh kiểu Mỹ, và xem Cloud Speech API trích xuất phụ đề cho nó.

Cần lưu ý rằng, Cloud Speech API hiện chỉ có thể xử lý các tập tin âm thanh một kênh. Nếu bạn gửi một tập tin với nhiều kênh vào nó, bạn sẽ nhận được một phản hồi lỗi.

5. Sử dụng Cloud Natural Language API

Bây giờ chúng ta có một phụ đề, chúng ta có thể truyền nó vào Cloud Natural Language API để phân tích nó. Để cho hướng dẫn này ngắn gọn, chúng ta sẽ chỉ chạy các phân tích thực thể và biểu cảm trên phụ đề. Nói cách khác, chúng ta sẽ xác định tất cả các thực thể được đề cập trong phụ đề, chẳng hạn như con người, địa điểm và nghề nghiệp, và đồng thời cho biết biểu cảm tổng quát của nó là buồn, trung lập hay vui.

Bước 1: Cập nhật Giao diện

Để cho phép người dùng bắt đầu phân tích, bố cục của chúng ta phải chứa một thành phần Button khác. Do đó, hãy thêm code sau đây vào tập tin bố cục XML của activity:

Bước 2: Diễn giải Phụ đề

REST API của Cloud Natural Language API cung cấp một tùy chọn tiện lợi được gọi là annotateText cho phép bạn chạy cả phân tích biểu cảm lẫn thực thể trên một tài liệu chỉ với một yêu cầu HTTP. Chúng ta sẽ sử dụng nó để phân tích phụ đề của chúng ta.

Bởi vì quá trình phân tích phải bắt đầu khi người dùng nhấn vào nút mà chúng ta đã tạo ra trong bước trước, nên hãy thêm một OnClickListener vào nó.

Để tương tác với API bằng thư viện Google API Client, bạn phải tạo một đối tượng CloudNaturalLanguage bằng lớp CloudNaturalLanguage.Builder. Hàm xây dựng của nó cũng nhận một HTTP transport và một JSON factory.

Hơn nữa, bằng cách gán một đối tượng CloudNaturalLanguageRequestInitializer vào nó, bạn có thể buộc nó bao gồm khóa API của bạn trong tất cả các yêu cầu của nó.

Tất cả các văn bản mà bạn muốn phân tích bằng API phải được đặt bên trong một đối tượng Document. Đối tượng Document cũng phải chứa thông tin cấu hình, chẳng hạn như ngôn ngữ của văn bản và nó có được định dạng như là văn bản thuần tuý hay là HTML. Do đó, hãy thêm code sau đây:

Tiếp theo, bạn phải tạo một đối tượng Features chỉ định các tính năng mà bạn muốn phân tích. Đoạn code sau đây sẽ cho cho bạn thấy cách tạo đối tượng Features để nói rằng bạn muốn trích xuất các thực thể và chỉ chạy phân tích biểu cảm.

Bây giờ bạn có thể kết hợp các đối tượng Document and Features để tạo nên một đối tượng AnnotateTextRequest, đối tượng mà có thể được truyền vào phương thức annotateText() để tạo ra một đối tượng AnnotateTextResponse.

Lưu ý rằng, chúng ta đang tạo ra phản hồi trong một thread mới bởi vì các hoạt động giao tiếp mạng không được phép trên giao diện người dùng.

Bạn có thể trích xuất một danh sách các thực thể từ đối tượng AnnotateTextResponse bằng cách gọi phương thức getEntities() của nó. Tương tự, bạn có thể trích xuất biểu cảm chung của phụ đề bằng cách gọi phương thức getDocumentSentiment(). Tuy nhiên, để lấy được điểm số thực tế của biểu cảm, bạn cũng phải gọi phương thức getScore() trả về một số float.

Như kỳ vọng, điểm số biểu cảm bằng 0 có nghĩa là tâm trạng trung lập, điểm số lớn hơn 0 nghĩa là tâm trạng đang vui, và điểm số ít hơn 0 nghĩa là tâm trạng đang buồn.

Những gì bạn làm với danh sách các thực thể và điểm số biểu cảm, tất nhiên là tùy thuộc vào bạn. Còn bây giờ, chúng ta chỉ hiển thị cả hai bằng một đối tượng AlertDialog.

Với code ở trên, điểm số biểu cảm sẽ được hiển thị trên tiêu đề của hộp thoại, và danh sách các thực thể sẽ được hiển thị trong phần thân của nó.

Nếu bạn chạy ứng dụng ngay lúc này, bạn sẽ có thể phân tích nội dung của các tập tin âm thanh cũng như trích xuất phụ đề từ chúng.

Phần Tóm tắt

Giờ đây, bạn đã biết cách sử dụng kết hợp các API Cloud Speech và Cloud Natural Language với nhau để tạo nên một ứng dụng Android không chỉ có thể trích xuất phụ đề từ một tập tin âm thanh mà còn chạy các phân tích thực thể và biểu cảm. Trong hướng dẫn này, bạn cũng đã được tìm hiểu về cách làm việc với các thư viện Storage Access Framework và Google Client API của Android.

Google thường xuyên bổ sung thêm các tính năng mới và thú vị—cùng với hỗ trợ thêm nhiều ngôn ngữ—cho cả hai API. Để cập nhật về chúng, hãy tham khảo tài liệu hướng dẫn chính thức.

Và sẵn đây, hãy kiểm tra một số bài viết khác của chúng tôi về các dịch vụ đám mây di động và máy học!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.