chrome.tts

Mô tả

Dùng API chrome.tts để phát văn bản được tổng hợp thành lời nói (TTS). Bạn cũng có thể xem API ttsEngine có liên quan. API này cho phép một tiện ích triển khai công cụ lời nói.

Chrome cung cấp tính năng này trên Windows (bằng SAPI 5), Mac OS X và ChromeOS, bằng cách sử dụng các tính năng tổng hợp lời nói do hệ điều hành cung cấp. Trên tất cả nền tảng, người dùng có thể cài đặt các tiện ích tự đăng ký làm công cụ lời nói thay thế.

Quyền

tts

Khái niệm và cách sử dụng

Tạo lời nói

Gọi speak() từ tiện ích của bạn để nói. Ví dụ:

chrome.tts.speak('Hello, world.');

Để dừng nói ngay lập tức, bạn chỉ cần gọi stop():

chrome.tts.stop();

Bạn có thể cung cấp các lựa chọn kiểm soát nhiều thuộc tính của lời nói, chẳng hạn như tốc độ, cao độ và nhiều thuộc tính khác. Ví dụ:

chrome.tts.speak('Hello, world.', {'rate': 2.0});

Bạn cũng nên chỉ định ngôn ngữ để chọn một bộ tổng hợp hỗ trợ ngôn ngữ đó (và phương ngữ khu vực, nếu có).

chrome.tts.speak('Hello, world.', {'lang': 'en-US', 'rate': 2.0});

Theo mặc định, mỗi lệnh gọi đến speak() sẽ làm gián đoạn mọi lời nói đang diễn ra và nói ngay lập tức. Để xác định xem một cuộc gọi có làm gián đoạn hoạt động nào hay không, bạn có thể gọi isSpeaking(). Ngoài ra, bạn có thể sử dụng lựa chọn enqueue để thêm câu này vào hàng đợi các câu sẽ được nói khi câu hiện tại kết thúc.

chrome.tts.speak('Speak this first.');
chrome.tts.speak(
    'Speak this next, when the first sentence is done.', {'enqueue': true});

Bạn có thể xem nội dung mô tả đầy đủ về tất cả các lựa chọn trong phần tts.speak(). Không phải công cụ chuyển lời nói thành văn bản nào cũng hỗ trợ tất cả các lựa chọn.

Để phát hiện lỗi và đảm bảo bạn đang gọi speak() đúng cách, hãy truyền một hàm gọi lại không nhận đối số. Trong lệnh gọi lại, hãy kiểm tra runtime.lastError để xem có lỗi nào không.

chrome.tts.speak(
  utterance,
  options,
  function() {
    if (chrome.runtime.lastError) {
      console.log('Error: ' + chrome.runtime.lastError.message);
    }
  }
);

Lệnh gọi lại sẽ trả về ngay lập tức, trước khi công cụ bắt đầu tạo lời nói. Mục đích của lệnh gọi lại là cảnh báo cho bạn về lỗi cú pháp khi bạn sử dụng TTS API, chứ không phải để phát hiện tất cả các lỗi có thể xảy ra trong quá trình tổng hợp và xuất lời nói. Để nắm bắt cả những lỗi này, bạn cần sử dụng một trình nghe sự kiện, được mô tả trong phần tiếp theo.

Lắng nghe các sự kiện

Để nhận thêm thông tin theo thời gian thực về trạng thái của lời nói được tạo, hãy truyền một trình nghe sự kiện trong các lựa chọn đến speak(), như sau:

chrome.tts.speak(
  utterance,
  {
    onEvent: function(event) {
      console.log('Event ' + event.type + ' at position ' + event.charIndex);
      if (event.type == 'error') {
        console.log('Error: ' + event.errorMessage);
      }
    }
  },
  callback
);

Mỗi sự kiện bao gồm một loại sự kiện, chỉ mục ký tự của lời nói hiện tại so với câu nói và đối với các sự kiện lỗi, một thông báo lỗi không bắt buộc. Các loại sự kiện là:

  • 'start': Công cụ đã bắt đầu nói câu.
  • 'word': Đã đạt đến ranh giới từ. Dùng event.charIndex để xác định vị trí hiện tại của lời nói.
  • 'sentence': Đã đạt đến ranh giới của một câu. Dùng event.charIndex để xác định vị trí hiện tại của lời nói.
  • 'marker': Đã đạt đến một điểm đánh dấu SSML. Dùng event.charIndex để xác định vị trí hiện tại của lời nói.
  • 'end': Công cụ đã nói xong câu.
  • 'interrupted': Câu này bị gián đoạn bởi một lệnh gọi khác đến speak() hoặc stop() và chưa kết thúc.
  • 'cancelled': Câu này đã được đưa vào hàng đợi, nhưng sau đó bị huỷ bằng một lệnh gọi khác đến speak() hoặc stop() và chưa bao giờ bắt đầu nói.
  • 'error': Đã xảy ra lỗi dành riêng cho công cụ và không thể nói câu này. Hãy xem event.errorMessage để biết thông tin chi tiết.

Bốn loại sự kiện ('end', 'interrupted', 'cancelled''error') là cuối cùng. Sau khi nhận được một trong những sự kiện đó, câu lệnh này sẽ không còn phát ra và không nhận được sự kiện mới nào từ câu lệnh này nữa.

Một số giọng nói có thể không hỗ trợ tất cả các loại sự kiện và một số giọng nói có thể không gửi bất kỳ sự kiện nào. Nếu bạn không muốn sử dụng giọng nói trừ phi giọng nói đó gửi một số sự kiện nhất định, hãy truyền các sự kiện bạn yêu cầu trong thành phần requiredEventTypes của đối tượng lựa chọn hoặc sử dụng getVoices() để chọn giọng nói đáp ứng yêu cầu của bạn. Cả hai đều được mô tả trong phần tiếp theo.

Ngôn ngữ đánh dấu SSML

Các câu nói được dùng trong API này có thể bao gồm mã đánh dấu bằng Ngôn ngữ đánh dấu tổng hợp lời nói (SSML). Nếu bạn sử dụng SSML, đối số đầu tiên cho speak() phải là một tài liệu SSML hoàn chỉnh có tiêu đề XML và thẻ <speak> cấp cao nhất, chứ không phải một đoạn tài liệu.

Ví dụ:

chrome.tts.speak(
  '<?xml version="1.0"?>' +
  '<speak>' +
  '  The <emphasis>second</emphasis> ' +
  '  word of this sentence was emphasized.' +
  '</speak>'
);

Không phải công cụ chuyển lời nói thành văn bản nào cũng hỗ trợ tất cả các thẻ SSML và một số công cụ có thể không hỗ trợ SSML, nhưng tất cả các công cụ đều phải bỏ qua mọi SSML mà chúng không hỗ trợ và vẫn nói văn bản cơ bản.

Chọn một giọng nói

Theo mặc định, Chrome sẽ chọn giọng nói phù hợp nhất cho mỗi câu mà bạn muốn nói, dựa trên ngôn ngữ. Trên hầu hết các hệ thống Windows, Mac OS X và ChromeOS, tính năng tổng hợp lời nói do hệ điều hành cung cấp có thể đọc mọi văn bản bằng ít nhất một ngôn ngữ. Tuy nhiên, một số người dùng có thể sử dụng nhiều giọng nói từ hệ điều hành và từ các công cụ chuyển lời nói thành văn bản do các tiện ích Chrome khác triển khai. Trong những trường hợp đó, bạn có thể triển khai mã tuỳ chỉnh để chọn giọng nói phù hợp hoặc trình bày cho người dùng danh sách các lựa chọn.

Để lấy danh sách tất cả các giọng nói, hãy gọi getVoices() và truyền cho hàm này một hàm nhận mảng các đối tượng TtsVoice làm đối số:

chrome.tts.getVoices(
  function(voices) {
    for (var i = 0; i < voices.length; i++) {
      console.log('Voice ' + i + ':');
      console.log('  name: ' + voices[i].voiceName);
      console.log('  lang: ' + voices[i].lang);
      console.log('  extension id: ' + voices[i].extensionId);
      console.log('  event types: ' + voices[i].eventTypes);
    }
  }
);

Loại

EventType

Chrome 54 trở lên

Enum

"start"

"end"

"word"

"sentence"

"marker"

"interrupted"

"đã huỷ"

"error"

"pause"

"resume"

TtsEvent

Một sự kiện từ công cụ TTS để truyền đạt trạng thái của một câu.

Thuộc tính

  • charIndex

    number không bắt buộc

    Chỉ mục của ký tự hiện tại trong câu nói. Đối với các sự kiện từ, sự kiện sẽ kích hoạt vào cuối một từ và trước khi bắt đầu từ tiếp theo. charIndex biểu thị một điểm trong văn bản ở đầu từ tiếp theo sẽ được nói.

  • errorMessage

    chuỗi không bắt buộc

    Nội dung mô tả lỗi, nếu loại sự kiện là error.

  • chiều dài

    number không bắt buộc

    Chrome 74 trở lên

    Độ dài của phần tiếp theo trong câu nói. Ví dụ: trong sự kiện word, đây là độ dài của từ sẽ được nói tiếp theo. Giá trị này sẽ được đặt thành -1 nếu không được công cụ lời nói đặt.

  • loại

    Loại này có thể là start ngay khi lời nói bắt đầu, word khi đạt đến ranh giới từ, sentence khi đạt đến ranh giới câu, marker khi đạt đến phần tử đánh dấu SSML, end khi đạt đến cuối câu, interrupted khi câu bị dừng hoặc gián đoạn trước khi đạt đến cuối, cancelled khi câu bị xoá khỏi hàng đợi trước khi được tổng hợp hoặc error khi xảy ra bất kỳ lỗi nào khác. Khi tạm dừng lời nói, sự kiện pause sẽ được kích hoạt nếu một câu nói cụ thể bị tạm dừng ở giữa và resume nếu một câu nói tiếp tục lời nói. Xin lưu ý rằng các sự kiện tạm dừng và tiếp tục có thể không kích hoạt nếu lời nói bị tạm dừng giữa các câu.

TtsOptions

Chrome 77 trở lên

Các lựa chọn về lời nói cho công cụ TTS.

Thuộc tính

  • desiredEventTypes

    string[] không bắt buộc

    Các loại sự kiện TTS mà bạn muốn theo dõi. Nếu thiếu, tất cả các loại sự kiện đều có thể được gửi.

  • enqueue

    boolean không bắt buộc

    Nếu được đặt thành true, sẽ xếp hàng câu này nếu TTS đang diễn ra. Nếu là false (mặc định), thì sẽ làm gián đoạn mọi lời nói hiện tại và xoá hàng đợi lời nói trước khi nói câu mới này.

  • extensionId

    chuỗi không bắt buộc

    Mã nhận dạng tiện ích của công cụ chuyển lời nói thành văn bản cần dùng (nếu biết).

  • gender

    VoiceGender không bắt buộc

    Không dùng nữa kể từ Chrome 77

    Giới tính không được dùng nữa và sẽ bị bỏ qua.

    Giới tính của giọng nói cho lời nói được tổng hợp.

  • lang

    chuỗi không bắt buộc

    Ngôn ngữ sẽ được dùng để tổng hợp, ở dạng ngôn ngữ-khu vực. Ví dụ: "en", "en-US", "en-GB", "zh-CN".

  • đề cử

    number không bắt buộc

    Cao độ khi nói nằm trong khoảng từ 0 đến 2 (bao gồm cả 0 và 2), trong đó 0 là thấp nhất và 2 là cao nhất. 1.0 tương ứng với cao độ mặc định của giọng nói.

  • vận tốc

    number không bắt buộc

    Tốc độ nói so với tốc độ mặc định của giọng nói này. 1.0 là tốc độ mặc định, thường là khoảng 180 đến 220 từ mỗi phút. Tốc độ 2.0 nhanh gấp đôi và tốc độ 0.5 chậm bằng một nửa. Bạn tuyệt đối không được dùng các giá trị dưới 0,1 hoặc trên 10,0, nhưng nhiều giọng nói sẽ hạn chế thêm tốc độ tối thiểu và tối đa. Ví dụ: một giọng nói cụ thể có thể không thực sự nói nhanh hơn 3 lần tốc độ bình thường ngay cả khi bạn chỉ định một giá trị lớn hơn 3,0.

  • requiredEventTypes

    string[] không bắt buộc

    Các loại sự kiện TTS mà giọng nói phải hỗ trợ.

  • voiceName

    chuỗi không bắt buộc

    Tên của giọng nói dùng để tổng hợp. Nếu để trống, hệ thống sẽ dùng mọi giọng nói có sẵn.

  • thể tích

    number không bắt buộc

    Âm lượng nói từ 0 đến 1 (tính cả 0 và 1), trong đó 0 là thấp nhất và 1 là cao nhất, với giá trị mặc định là 1.0.

  • onEvent

    void optional

    Hàm này được gọi bằng các sự kiện xảy ra trong quá trình nói câu.

    Hàm onEvent có dạng như sau:

    (event: TtsEvent) => {...}

    • event

      Sự kiện cập nhật từ công cụ chuyển văn bản sang lời nói cho biết trạng thái của câu này.

TtsVoice

Nội dung mô tả về một giọng nói có thể dùng để tổng hợp lời nói.

Thuộc tính

  • eventTypes

    EventType[] không bắt buộc

    Tất cả các loại sự kiện gọi lại mà giọng nói này có thể gửi.

  • extensionId

    chuỗi không bắt buộc

    Mã nhận dạng của tiện ích cung cấp giọng nói này.

  • gender

    VoiceGender không bắt buộc

    Không dùng nữa kể từ Chrome 70

    Giới tính không được dùng nữa và sẽ bị bỏ qua.

    Giới tính của giọng nói này.

  • lang

    chuỗi không bắt buộc

    Ngôn ngữ mà giọng nói này hỗ trợ, ở dạng language-region. Ví dụ: "en", "en-US", "en-GB", "zh-CN".

  • từ xa

    boolean không bắt buộc

    Nếu là true, thì công cụ tổng hợp là một tài nguyên mạng từ xa. Độ trễ có thể cao hơn và có thể phát sinh chi phí băng thông.

  • voiceName

    chuỗi không bắt buộc

    Tên của giọng nói.

VoiceGender

Chrome 54 trở lên Không dùng nữa kể từ Chrome 70

Thuộc tính giới tính không được dùng nữa và sẽ bị bỏ qua.

Enum

"male"

"female"

Phương thức

getVoices()

chrome.tts.getVoices(): Promise<TtsVoice[]>

Lấy một mảng gồm tất cả các giọng nói có sẵn.

Giá trị trả về

  • Promise<TtsVoice[]>

    Chrome 101 trở lên

isSpeaking()

chrome.tts.isSpeaking(): Promise<boolean>

Kiểm tra xem công cụ có đang nói hay không. Trên Mac OS X, kết quả là true bất cứ khi nào công cụ chuyển lời nói thành văn bản của hệ thống đang nói, ngay cả khi Chrome không bắt đầu lời nói.

Giá trị trả về

  • Promise<boolean>

    Chrome 101 trở lên

pause()

chrome.tts.pause(): void

Tạm dừng tính năng tổng hợp giọng nói, có thể là ở giữa một câu nói. Lệnh gọi để tiếp tục hoặc dừng sẽ huỷ tạm dừng giọng nói.

resume()

chrome.tts.resume(): void

Nếu lời nói bị tạm dừng, thì sẽ tiếp tục nói từ chỗ đã dừng.

speak()

chrome.tts.speak(
  utterance: string,
  options?: TtsOptions,
)
: Promise<void>

Nói văn bản bằng công cụ chuyển văn bản sang lời nói.

Thông số

  • câu nói

    chuỗi

    Văn bản cần đọc, có thể là văn bản thuần tuý hoặc một tài liệu SSML hoàn chỉnh, có định dạng hợp lệ. Những công cụ chuyển lời nói thành văn bản không hỗ trợ SSML sẽ loại bỏ các thẻ và đọc văn bản. Độ dài tối đa của văn bản là 32.768 ký tự.

  • tùy chọn

    TtsOptions không bắt buộc

    Các lựa chọn về lời nói.

Giá trị trả về

  • Promise<void>

    Chrome 101 trở lên

stop()

chrome.tts.stop(): void

Dừng mọi giọng đọc hiện tại và xoá hàng đợi của mọi câu đang chờ xử lý. Ngoài ra, nếu lời nói bị tạm dừng, thì giờ đây, lời nói sẽ được tiếp tục cho lệnh gọi tiếp theo để nói.

Sự kiện

onVoicesChanged

Chrome 124 trở lên
chrome.tts.onVoicesChanged.addListener(
  callback: function,
)

Được gọi khi danh sách tts.TtsVoice mà getVoices sẽ trả về đã thay đổi.

Thông số

  • callback

    hàm

    Tham số callback có dạng như sau:

    () => void