1. Tổng quan
Trong lớp học lập trình này, bạn sẽ tìm hiểu cách gửi một tệp âm thanh thông qua API Speech-to-Text của Google Cloud, sau đó xuất bản ghi âm sang một Tài liệu trên Google. Speech to Text API rất dễ sử dụng và áp dụng các mạng nơ-ron mạnh mẽ để giúp nhà phát triển chuyển âm thanh thành văn bản! Ngoài ra, chiến dịch này còn sử dụng công nghệ học máy.
Bạn sẽ sử dụng Google Docs API để tạo và ghi vào một tài liệu mới. Bạn sẽ tạo một ứng dụng dòng lệnh Java và chạy mã bằng hệ thống xây dựng gradle, sau đó dùng Docs API để xem kết quả.
Kiến thức bạn sẽ học được
- Cách sử dụng API Chuyển lời nói thành văn bản của Google Cloud
- Cách sử dụng Google Tài liệu API để tạo tài liệu mới
- Cách sử dụng Docs API để ghi vào tài liệu
Bạn cần có
- Đã cài đặt Java (phiên bản 7 trở lên)
- Đã cài đặt Gradle (phiên bản 5 trở lên)
- Có quyền truy cập vào Internet và trình duyệt web
- Tài khoản Google
- Một dự án trên Google Cloud Platform
2. Thiết lập dự án
Tạo dự án trên đám mây
- Đăng nhập vào Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một dự án hiện có. (Nếu chưa có tài khoản Gmail hoặc Workspace, bạn phải tạo một tài khoản.)
Hãy nhớ mã dự án, một tên duy nhất trên tất cả các dự án trên Google Cloud (tên ở trên đã được sử dụng và sẽ không hoạt động đối với bạn, xin lỗi!). Sau này trong lớp học lập trình này, chúng ta sẽ gọi nó là PROJECT_ID.
- Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên của Google Cloud.
Việc thực hiện lớp học lập trình này sẽ không tốn nhiều chi phí, nếu có. Hãy nhớ làm theo mọi hướng dẫn trong phần "Dọn dẹp" để biết cách tắt các tài nguyên nhằm tránh bị tính phí ngoài phạm vi hướng dẫn này. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí trị giá 300 USD.
Tạo một khoá tài khoản dịch vụ cho API Cloud Speech-to-Text

- Truy cập vào bảng điều khiển GCP rồi tìm dự án mới của bạn
- Tạo một tài khoản dịch vụ
- Tải khoá tài khoản dịch vụ xuống dưới dạng JSON
- Đặt biến môi trường GOOGLE_APPLICATION_CREDENTIALS thành đường dẫn tệp của tệp JSON chứa khoá tài khoản dịch vụ của bạn. Nếu khởi động lại phiên shell, bạn sẽ phải đặt lại biến.
$ export GOOGLE_APPLICATION_CREDENTIALS="[PATH]"
Ví dụ:
$ export GOOGLE_APPLICATION_CREDENTIALS="/home/usr/downloads/ServiceAccount.json"
Lấy thông tin đăng nhập cho Docs API
- Trong bảng điều khiển GCP, hãy chuyển đến phần Thông tin đăng nhập
- Tạo khoá OAuth 2.0 và tải khoá đó xuống dưới dạng JSON
- Đổi tên tệp
credentials.jsonvà đảm bảo tệp đó nằm trong thư mụcsrc/main/resources/của mã
Bật API

- Chọn thẻ Trang tổng quan, nhấp vào nút Bật API và dịch vụ rồi bật 2 API sau:
- Chuyển lời nói thành văn bản
- Google Tài liệu

Giờ thì bạn đã sẵn sàng bắt đầu làm việc với mã của mình.
3. Thiết lập mã
Nhận mã mẫu
Để lấy mã mẫu, hãy tải tệp zip xuống máy tính...
...hoặc sao chép kho lưu trữ GitHub từ dòng lệnh.
$ git clone git@github.com:googleworkspace/docs-transcript-codelab.git
Bạn sẽ làm việc trong tệp CreateTranscript.java bên trong thư mục start. Bạn không nên sửa đổi các tệp gradle.
Trong thư mục của bạn, hãy chuyển đến thư mục start (bắt đầu) rồi mở tệp CreateTranscript.java. Di chuyển xuống nơi bạn thấy phần khai báo lớp CreateTranscript.
public class CreateTranscript {
private static final String CREDENTIALS_FILE_PATH = "/credentials.json";
// Specify audio file name below.
private static final String AUDIO_FILENAME = "audioFile.wav";
private static final String TOKENS_DIRECTORY_PATH = "tokens";
private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
private static final String APPLICATION_NAME = "CreateTranscript";
private static final List<String> SCOPES = Collections.singletonList(DocsScopes.DOCUMENTS);
Đối với biến SCOPES, bạn đã chỉ định rằng mã của bạn sẽ có thể xem và quản lý tài liệu của người dùng trên Google Tài liệu. Nếu mã của bạn yêu cầu quyền uỷ quyền vượt quá hoặc khác với quyền truy cập này, hãy nhớ điều chỉnh biến này cho phù hợp dựa trên Phạm vi API của Google theo OAuth 2.0.
Ví dụ: nếu không viết vào một tệp Google Tài liệu, bạn có thể thay đổi phạm vi thành DOCUMENTS_READONLY. Biến SCOPES không chỉ cần thiết để ứng dụng của bạn có quyền truy cập phù hợp mà còn để duy trì tính minh bạch với người dùng. Người dùng sẽ thấy các phạm vi cụ thể mà bạn yêu cầu trong trang xác minh OAuth. Tại đây, họ phải đồng ý sử dụng ứng dụng.
Đổi tên biến
Đảm bảo rằng bạn khai báo chính xác các biến nêu trên cho dự án của mình.
- Đảm bảo rằng AUDIO_FILENAME được đặt thành tên của tệp minh hoạ mà bạn đang gửi đến Speech to Text API. Trong tệp CreateTranscript.java, bạn sẽ thấy tệp này đã được đặt đúng cách.
- Đổi tên CREDENTIALS_FILE_PATH thành tên của tệp thông tin đăng nhập đã tải xuống (phải là "/
credentials.json'). Đảm bảo rằng tệp này nằm trong thư mụcsrc/main/resourcescủa bạn. Vì vậy, hãy nhớ tạo thư mục này nếu quá trình sao chép GitHub không thực hiện việc này cho bạn.
Giờ đây, bạn có thể bắt đầu chạy mã!
4. Khởi động một ứng dụng Tài liệu
Trong tệp CreateTranscript.java, hãy tìm khai báo phương thức chính và xem xét nội dung bên trong:
final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
Docs service = new Docs.Builder(HTTP_TRANSPORT, JSON_FACTORY,
getCredentials(HTTP_TRANSPORT))
.setApplicationName(APPLICATION_NAME)
.build();
Uỷ quyền chức năng
Việc đầu tiên bạn thực hiện ở đây là tạo Docs service (biến). Dịch vụ này đại diện cho một ứng dụng API được uỷ quyền, lưu giữ thông tin đăng nhập của bạn và trong trường hợp này là thông tin xác thực người dùng cuối của bạn.
Trong mã của bạn, mọi hàm gọi API Tài liệu đều cần sử dụng biến service này để thực hiện các tác vụ liên quan đến Tài liệu.
5. Tạo tài liệu trên Google
Bạn sẽ tạo một Tài liệu Google mới có tiêu đề cụ thể. Vì vậy, hãy sao chép mã dưới đây vào hàm createDocument.
Document doc = new Document().setTitle("Transcript for " +
AUDIO_FILENAME);
doc = service.documents().create(doc).execute();
String documentId = doc.getDocumentId();
return documentId;
Hàm này trả về mã nhận dạng tệp trên Drive của Google Tài liệu. Bạn cũng có thể tìm thấy mã nhận dạng này trong URL của tài liệu.
Tiếp theo, bạn sẽ khởi động ứng dụng Speech-to-Text.
6. Gọi Speech to Text API
Nhiệm vụ tiếp theo mà bạn muốn thực hiện trong mã là lấy bản chép lời bằng văn bản cho tệp âm thanh. Trong CreateTranscript.java, hãy tìm hàm getTranscript().
Trước tiên, hãy lấy đường dẫn và byte âm thanh của tệp âm thanh:
SpeechClient speech = SpeechClient.create();
Path path = Paths.get(AUDIO_FILENAME);
byte[] data = Files.readAllBytes(path);
ByteString audioBytes = ByteString.copyFrom(data);
Định cấu hình tính năng Nhận dạng lời nói
Tiếp theo, bạn phải khởi chạy biến RecognitionConfig một cách chính xác.
Tại đây, config cung cấp thông tin về cách chính xác mà trình nhận dạng giọng nói sẽ xử lý yêu cầu của bạn. Bạn cần chỉnh sửa setLanguageCode() nếu, chẳng hạn như tệp âm thanh của bạn không phải bằng tiếng Anh, và thay đổi setSampleRateHertz() nếu tệp âm thanh của bạn có tốc độ lấy mẫu khác tính bằng Hertz (1600 là tốc độ tối ưu).
RecognitionConfig config =
RecognitionConfig.newBuilder()
.setEncoding(AudioEncoding.LINEAR16)
.setLanguageCode("en-US")
.setSampleRateHertz(8000)
.build();
RecognitionAudio audio =
RecognitionAudio.newBuilder().setContent(audioBytes).build();
RecognizeResponse response = speech.recognize(config, audio);
List<SpeechRecognitionResult> results = response.getResultsList();
Chuẩn bị văn bản
Cuối cùng, hãy xử lý biến result của bản chép lời tệp âm thanh và chuẩn bị để chèn biến đó vào một tài liệu.
Mỗi mục trong kết quả là một bản chép lời thuộc loại SpeechRecognitionAlternatives. Do đó, mỗi mục chứa 2 phần: bản chép lời dạng văn bản và điểm số độ tin cậy tương ứng của API.
List<Request> requests = new ArrayList<>();
for (SpeechRecognitionResult result : results) {
// Using the first + most likely alternative transcript
SpeechRecognitionAlternative alternative =
result.getAlternativesList().get(0);
String toInsert = alternative.getTranscript();
// Add requests array list to return.
requests.add(
new Request()
.setInsertText(
new InsertTextRequest()
.setText(toInsert)
.setEndOfSegmentLocation(new
EndOfSegmentLocation().setSegmentId(""))));
}
return requests;
7. Chèn văn bản vào Tài liệu
Bây giờ, bạn sẽ chèn văn bản bản chép lời vào Google Tài liệu. Để sửa đổi tài liệu, bạn cần sử dụng phương thức BatchUpdate. BatchUpdate là một vùng chứa cho nhiều loại yêu cầu ghi và ở đây, bạn sẽ sử dụng InsertTextRequest.
EndOfSegmentLocation là một tham số quan trọng, chỉ định vị trí bạn muốn in văn bản trong Tài liệu. Trong mã nguồn, bạn đang chèn văn bản vào nội dung của tài liệu.
Hãy chèn mã bên dưới vào hàm của bạn để xem cách kết hợp kết quả của Speech-to-Text API với các lệnh gọi đến Docs API có thể giúp chúng ta chèn bản chép lời của một tệp âm thanh vào một Google Tài liệu:
BatchUpdateDocumentRequest body = new BatchUpdateDocumentRequest();
service.documents().batchUpdate(docId,
body.setRequests(insertRequests)).execute();
Tạo yêu cầu
Khi đưa ra yêu cầu BatchUpdate, bạn đặt 2 quy cách rất quan trọng: nội dung bạn muốn in (.setText()), cũng như vị trí bạn muốn in trong tài liệu (.setIndex(1)).
Giờ đây, bạn đã chèn bản chép lời của tệp âm thanh vào Tài liệu mà bạn đã tạo.
8. Chạy mã
Giờ đây, bạn đã có tất cả mã cần thiết để lấy một tệp âm thanh, lấy bản chép lời và in bản chép lời đó vào một Google Tài liệu mới tạo. Hãy bắt đầu thôi!
Vì bạn sẽ chạy mã java bằng hệ thống xây dựng gradle, nên bạn phải cho tệp build.gradle biết chính xác những gì cần xây dựng và chạy. Trong dự án này và các dự án khác, hãy đảm bảo bạn giữ mainClassName nhất quán với lớp java mà bạn muốn chạy.
Tuyệt vời! Giờ thì bạn đã sẵn sàng chạy mã. Để thực hiện việc này, hãy nhập nội dung sau vào dòng lệnh:
$ gradle run
Xác thực người dùng cuối
Trong lần đầu tiên chạy mã này, bạn sẽ thấy một URL được in trong thiết bị đầu cuối, yêu cầu bạn đăng nhập vào tài khoản dịch vụ và cho phép truy cập vào Google Tài liệu của tài khoản đó. Sau khi cho phép truy cập, bạn sẽ thấy một tệp mới được lưu trữ trong thư mục của mình.
Trong thư mục làm việc, bạn sẽ thấy một thư mục mới tạo có tên là tokens, chứa một tệp StoredCredential. Đây là mã xác thực mà bạn vừa cung cấp. Mã này do ứng dụng khách của bạn yêu cầu từ Máy chủ xác thực của Google, được trích xuất từ phản hồi của máy chủ và giờ sẽ được gửi đến mọi API mà bạn gọi.
Giải pháp
Nếu mã của bạn không hoạt động, hãy xem bên trong tệp CreateTranscript.java trong thư mục finish. Tệp này có tất cả mã của bạn đúng như yêu cầu để chạy thành công.
Bây giờ, hãy xem kết quả.
9. Xem kết quả
Bạn vừa tạo một Tài liệu Google mới chứa bản chép lời của tệp âm thanh, vì vậy, hãy xem qua tài liệu đó.
Tài liệu này được tạo thông qua tài khoản mà người dùng cuối đã cấp quyền uỷ quyền. Một khả năng mở rộng là bạn có thể tự động chia sẻ Tài liệu này với người khác bằng API Drive.
Khi dùng mã nguồn và tệp âm thanh được cung cấp, bạn sẽ thấy như sau:

10. Xin chúc mừng!
Giờ đây, bạn đã học được cách tạo một Google Tài liệu, thực hiện lệnh gọi đến Speech-to-Text API và xuất bản chép lời của tệp âm thanh vào Tài liệu bạn đã tạo.
Những điểm có thể cải thiện
Sau đây là một số ý tưởng về cách tạo một bản tích hợp hấp dẫn hơn:
- Thiết lập mã để lắng nghe thời điểm một tệp âm thanh được thêm vào bộ chứa Google Cloud Storage Drive của bạn và kích hoạt một Google Cloud Function để thực thi mã này
- Thử chèn văn bản vào một tệp Google Tài liệu có nội dung
Tìm hiểu thêm
- Đọc Tài liệu dành cho nhà phát triển sử dụng API của Google Tài liệu
- Đăng câu hỏi và tìm câu trả lời trên Stack Overflow trong thẻ google-docs-api