Files
espeak-ng/chromium_extension/README.md
T
2021-07-14 22:54:26 -07:00

2.7 KiB

Motivation

Web Speech API does not support SSML input to the speech synthesis engine https://github.com/WICG/speech-api/issues/10, or the ability to capture the output of speechSynthesis.speak() as aMedaiStreamTrack or raw audio https://lists.w3.org/Archives/Public/public-speech-api/2017Jun/0000.html.

See Issue 1115640: [FUGU] NativeTransferableStream.

Synopsis

Native Messaging => eSpeak NG => PHP passthru() => fetch() => Transferable Streams => MediaStreamTrack.

Use local espeak-ng with -m option set in the browser.

Output speech sythesis audio as a live MediaStreamTrack.

Use Native Messaging, PHP passthru() to input text and Speech Synthesis Markup Language as STDIN to espeak-ng, stream STDOUT in "real-time" as live MediaStreamTrack.

Install
Dependencies

eSpeak NG Building eSpeak NG.

PHP is used for passthru(). Substitute server language of choice.

git clone https://github.com/guest271314/native-messaging-espeak-ng.git
cd native-messaging-espeak-ng/
chmod +x local_server.sh index.php

Navigate to chrome://extensions, set Developer mode to on, click Load unpacked, select downloaded git directory.

Note the generated extension ID, substitute that value for <id> in native_messaging_espeakng.json, AudioStream.js, index.php; add the value to "extensions" array in manifest.json.

Substitute full local path to local_server.sh for /path/to in native_messaging_espeakng.json.

Copy native_messaging_espeakng.json to NativeMessagingHosts directory in Chromium or Chrome configuration folder, on Linux, i.e., ~/.config/chromium; ~/.config/google-chrome-unstable.

cp native_messaging_espeakng ~/.config/chromium/NativeMessagingHosts

Reload extension.

Usage

On origins listed in "matches" array in "web_accessible_resources" object in manifest.json, e.g., at console

var text = `Test`;
var stdin = `espeak-ng -m --stdout "${text}"`;
var espeakng = new AudioStream({ stdin, recorder: true });
// espeakng.mediaStream: MediaStream containing MediaStreamTrack source output of espeak-ng --stdout
var ab = await espeakng.start();
console.log(
  URL.createObjectURL(new Blob([ab], { type: 'audio/webm;codecs=opus' }))
);

Abort the request and audio output.

await espeakng.abort()

To turn local server on and off with user action pin and click the extension icon on Chromium or Chrome toolbar.