В настоящее время реализация Спецификация Web Speech API от хром а также Fire Fox не поддерживает разбор Язык разметки для синтеза речи (SSML), когда SSML установлен на text
собственностью SpeechSyntheisUtterance
экземпляр и передан window.speechSynthesis.speak()
вызов; увидеть Реализация разбора SSML в браузерах; 5.2.3 Атрибуты SpeechSynthesisUtterance; Как настроить параметры команд, вызываемых браузером?.
Хром исходный код для сокета Unix подключиться к speech-dispatcher
связь, кажется, в /src/chrome/browser/speech/tts_linux.cc
{
// spd_open has memory leaks which are hard to suppress.
// http://crbug.com/317360
ANNOTATE_SCOPED_MEMORY_LEAK;
conn_ = libspeechd_loader_.spd_open(
"chrome", "extension_api", NULL, SPD_MODE_THREADED);
}
что отражается на /run/user/1000/speech-dispatcher/log
speechd: Updating client specific settings "linux:chrome:extension_api"
Исходный код хрома на /src/third_party/speech-dispatcher/libspeechd.h
появляется, чтобы определить SSML_DATA_MODE
описано в speech-dispatcher
документация
speech-dispatcher
В документации говорится, что файл конфигурации пользователя можно использовать для установки параметров для конкретных клиентов.
4.1.6 Команды настройки параметров
Доступны следующие команды настройки параметров. За
у клиентов конфигурации и истории есть также функции для настройки
значение для некоторого другого соединения и для всех соединений. Они есть
перечислены отдельно ниже.Функция C API:
int spd_set_data_mode(SPDConnection *connection,
Установите режим данных Speech Dispatcher. В настоящее время равнина
SPDDataMode mode)
текст и SSML поддерживаются. SSML особенно полезен, если вы хотите
использовать индексные метки или включать изменения параметров голоса в тексте.mode — запрашиваемый режим данных:
SPD_DATA_TEXT
или жеSPD_DATA_SSML
,
SPD_DATA_SSML
не установлен в on
при создании SSIP соединение от Chromium до speech-dispatcher
например, как продемонстрировал @xmash в Как использовать индексные метки в "речь-диспетчерская"?
spd_execute_command_wo_mutex( m_connection, "SET SELF SSML_MODE on" );
также невозможно передать опции модулю синтеза речи по умолчанию, m
за espeak
или же -x
за spd-say
.
С LogLevel
установлен в 4
или же 5
/run/user/1000/speech-dispatcher/log
перечисляет связь между Chromium (клиент) и speech-dispatcher
speechd: Module set parameters
(сервер), который также можно посмотреть на stdout
с использованием PID
в /run/user/1000/speech-dispatcher/pid
а также strace
, увидеть Есть ли способ перехватить межпроцессное взаимодействие в Unix / Linux?
$ sudo strace -ewrite -p $PID
write(22, "216 OK OUTPUT MODULE SET\r\n", 26) = 26
Похоже, что не существует опции для включения разбора SSML из speechd.conf
или же espeak.conf
следующий ход
$ spd-conf -u
При попытке проанализировать SSML с помощью JavaScript на SpeechSynthesisSSMLParser столкнулся с ошибка на хром при попытке разобрать <break>
элемент, где не ясно, является ли spd-say
вызывается или модуль вывода по умолчанию, например, espeak
запускается когда window.speechSynthesis.speak()
вызывается браузером; увидеть /src/out/Debug/gen/library_loaders/libspeechd.h.
Создан подход к использованию php
звонить espeak
с помощью shell_exec()
который возвращает ожидаемый результат
// JavaScript
async function SSMLStream({ssml="", options=""}) {
const fd = new FormData();
fd.append("ssml", ssml);
fd.append("options", options);
const request = await fetch("speak.php", {method:"POST", body:fd});
const response = await request.arrayBuffer();
return response;
}
let ssml = `<speak version="1.0" xml:lang="en-US">
Here are <say-as interpret-as="characters">SSML</say-as> samples.
Hello universe, how are you today?
Try a date: <say-as interpret-as="date" format="dmy" detail="1">10-9-1960</say-as>
This is a <break time="2500ms" /> 2.5 second pause.
This is a <break /> sentence break</prosody> <break />
<voice name="us-en+f3" rate="x-slow" pitch="0.25">espeak using</voice>
PHP and <voice name="en-us+f2"> <sub alias="JavaScript">JS</sub></voice>
</speak>`;
SSMLStream({ssml, options:"-v en-us+f1"})
.then(async(data) => {
let context = new AudioContext();
let source = context.createBufferSource();
source.buffer = await context.decodeAudioData(data);
source.connect(context.destination);
source.start()
})
// PHP
<?php
if(isset($_POST["ssml"])) {
header("Content-Type: audio/x-wav");
$options = $_POST["options"];
echo shell_exec("espeak -m --stdout " . $options . " '" . $_POST["ssml"] . "'");
};
Требование:
Разбор SSML, установленный в текстовом свойстве SpeechSynthesisUtterance
используя существующие возможности нативной программы, вызываемой для преобразования текста в речь speech-dispatcher
модуль вывода, использующий возможности браузера по умолчанию.
Вопросы:
1) Как программно прослушивать PID
когда speech-dispatcher --spawn-communication-method unix_socket --socket-path /run/user/1000/speech-dispatcher/speechd.sock
вызывается браузером Chromium, затем spd_execute_command_wo_mutex
или же spd_execute_command_wo_mutex
к speech-dispatcher
сервер, использующий установленное сокетное соединение Unix в качестве клиента (Chromium) с "SET SELF SSML_MODE on"
в качестве второго параметра, чтобы включить разбор SSML для всех вызовов window.speechSynthesis.speak()
в браузере Chromium?
2) Если 1) невозможно, что нужно отрегулировать в исходном коде Chromium, чтобы включить разбор SSML для соединения с сокетом unix, например, при инструменты / generate_library_loader / generate_library_loader.py?
3) Если 1) и 2) не являются жизнеспособными вариантами, как преобразовать код JavaScript и PHP в код C ++ в формате, используемом браузером Chromium; и как собрать Chromium с включенным патчем; с целью разоблачения speak
Функция принимает параметры, которые могут быть переданы в собственное приложение для синтеза речи, где анализируется SSML, и полученный звуковой вывод возвращается вызывающей стороне JavaScript как ArrayBuffer
?
4) Если доступны варианты, отличные от 1), 2) и 3), которые могут удовлетворить требования, как мы можем решить запрос программным путем; без необходимости запускать локальный сервер вручную terminal
?
Задача ещё не решена.
Других решений пока нет …