Ứng dụng web điều khiển bằng giọng nói – Giới thiệu về Web Speech API

Web Speech API mới giúp bạn dễ dàng thêm tính năng nhận dạng lời nói vào trang web. API này cho phép kiểm soát tốt và tính linh hoạt đối với các tính năng nhận dạng lời nói trong Chrome phiên bản 25 trở lên. Sau đây là một ví dụ cho thấy văn bản mà hệ thống nhận dạng được xuất hiện gần như ngay lập tức trong khi bạn nói.

Bản minh hoạ Web Speech API

PHÁT HÀNH / NGUỒN

Hãy cùng tìm hiểu nâng cao. Trước tiên, chúng ta sẽ kiểm tra xem trình duyệt có hỗ trợ Web Speech API hay không bằng cách kiểm tra xem đối tượng webkitSpeechRecognition có tồn tại hay không. Nếu không, chúng tôi khuyên người dùng nâng cấp trình duyệt của họ. (Vì API này vẫn đang trong quá trình thử nghiệm nên hiện có tiền tố là nhà cung cấp.) Cuối cùng, chúng ta tạo đối tượng webkitSpeechRecognition cung cấp giao diện lời nói, đồng thời đặt một số thuộc tính và trình xử lý sự kiện của đối tượng đó.

if (!('webkitSpeechRecognition' in window)) {
    upgrade();
} else {
    var recognition = new webkitSpeechRecognition();
    recognition.continuous = true;
    recognition.interimResults = true;

    recognition.onstart = function() { ... }
    recognition.onresult = function(event) { ... }
    recognition.onerror = function(event) { ... }
    recognition.onend = function() { ... }
    ...

Giá trị mặc định của continuous là false, nghĩa là khi người dùng ngừng nói, tính năng nhận dạng lời nói sẽ kết thúc. Chế độ này phù hợp với văn bản đơn giản như các trường nhập dữ liệu ngắn. Trong bản minh hoạ này, chúng ta đặt chính sách này thành true để quá trình nhận dạng sẽ tiếp tục ngay cả khi người dùng tạm dừng trong khi nói.

Giá trị mặc định của interimResults là false, nghĩa là kết quả duy nhất do trình nhận dạng trả về là kết quả cuối cùng và sẽ không thay đổi. Bản minh hoạ đặt giá trị này thành true (đúng) nên chúng tôi sẽ sớm nhận được kết quả tạm thời và có thể sẽ thay đổi. Hãy xem kỹ bản minh hoạ, văn bản màu xám là văn bản tạm thời và đôi khi thay đổi, trong khi văn bản màu đen là câu trả lời từ trình nhận dạng được đánh dấu là cuối cùng và sẽ không thay đổi.

Để bắt đầu, người dùng nhấp vào nút micrô để kích hoạt mã sau:

function startButton(event) {
    ...
    final_transcript = '';
    recognition.lang = select_dialect.value;
    recognition.start();

Chúng tôi đặt ngôn ngữ nói cho trình nhận dạng giọng nói "lang" thành giá trị BCP-47 mà người dùng đã chọn qua danh sách lựa chọn thả xuống, ví dụ: "en-US" cho tiếng Anh-Mỹ. Nếu bạn không đặt thuộc tính này, thì chế độ mặc định sẽ là ngôn ngữ của hệ phân cấp và thành phần gốc của tài liệu HTML. Tính năng nhận dạng lời nói của Chrome hỗ trợ nhiều ngôn ngữ (xem bảng "langs" trong nguồn minh hoạ), cũng như một số ngôn ngữ viết từ phải sang trái không có trong bản minh hoạ này, chẳng hạn như he-IL và ar-EG.

Sau khi đặt ngôn ngữ, chúng ta sẽ gọi recognition.start() để kích hoạt trình nhận dạng giọng nói. Sau khi bắt đầu ghi lại âm thanh, nó sẽ gọi onstart trình xử lý sự kiện, sau đó đối với mỗi tập hợp kết quả mới, nó sẽ gọi onresult trình xử lý sự kiện.

recognition.onresult = function(event) {
    var interim_transcript = '';

    for (var i = event.resultIndex; i < event.results.length; ++i) {
        if (event.results[i].isFinal) {
            final_transcript += event.results[i][0].transcript;
        } else {
            interim_transcript += event.results[i][0].transcript;
        }
    }
    final_transcript = capitalize(final_transcript);
    final_span.innerHTML = linebreak(final_transcript);
    interim_span.innerHTML = linebreak(interim_transcript);
    };
}

Trình xử lý này nối tất cả kết quả đã nhận được cho đến thời điểm này thành 2 chuỗi: final_transcriptinterim_transcript. Các chuỗi kết quả có thể chứa "\n", chẳng hạn như khi người dùng nói "đoạn mới", vì vậy chúng ta sử dụng hàm linebreak để chuyển đổi các chuỗi này thành thẻ HTML <br> hoặc <p>. Cuối cùng, hàm này đặt các chuỗi này làm phần tử bên trong của các phần tử <span> tương ứng: final_span được tạo kiểu bằng văn bản màu đen và interim_span được tạo kiểu bằng văn bản màu xám.

interim_transcript là biến cục bộ và được tạo lại hoàn toàn mỗi khi sự kiện này được gọi vì có thể tất cả kết quả tạm thời đã thay đổi kể từ sự kiện onresult gần đây nhất. Chúng ta có thể làm tương tự cho final_transcript bằng cách bắt đầu vòng lặp for tại 0. Tuy nhiên, do văn bản cuối cùng không bao giờ thay đổi, nên chúng ta đã cải thiện mã ở đây hiệu quả hơn một chút bằng cách đặt final_transcript thành một toàn bộ để sự kiện này có thể bắt đầu vòng lặp for tại event.resultIndex và chỉ thêm bất kỳ văn bản cuối cùng mới nào.

Vậy là xong! Phần còn lại của mã ở đó chỉ để làm cho mọi thứ trông đẹp mắt. Tính năng này duy trì trạng thái, hiển thị cho người dùng một số thông báo và hoán đổi hình ảnh GIF trên nút micrô giữa micrô tĩnh, hình ảnh dấu gạch chéo micrô và hiệu ứng động từ micrô bằng dấu chấm đỏ nhấp nháy.

Hình ảnh đường gạch chéo chữ hiển thị khi recognition.start() được gọi, sau đó được thay thế bằng micrô-animate khi onstart kích hoạt. Thông thường, điều này xảy ra nhanh đến mức dấu gạch chéo là không thể nhìn thấy. Tuy nhiên, trong lần đầu tiên tính năng nhận dạng lời nói được sử dụng, Chrome cần phải yêu cầu người dùng cấp quyền sử dụng micrô. Trong trường hợp đó, onstart chỉ kích hoạt khi người dùng cho phép và khi người dùng cho phép. Các trang được lưu trữ trên HTTPS không cần phải xin cấp quyền nhiều lần, trong khi các trang được lưu trữ HTTP thì có.

Vì vậy, hãy làm cho trang web của bạn trở nên sống động bằng cách cho phép chúng lắng nghe ý kiến của người dùng!

Chúng tôi muốn nghe ý kiến phản hồi của bạn...

Tham khảo Sách trắng về quyền riêng tư của Chrome để tìm hiểu cách Google xử lý dữ liệu thoại từ API này.