4) Если доступны варианты, отличные от 1), 2) и 3), которые могут удовлетворить требования, как мы можем решить запрос программным путем; без необходимости запускать локальный сервер вручную

тоящее время реализацияСпецификация Web Speech API похром а такжеFire Fox не поддерживает разборЯзык разметки для синтеза речи (SSML), когда для SSML установлено значениеtext собственностьюSpeechSyntheisUtterance экземпляр и переданwindow.speechSynthesis.speak() вызов; видетьРеализация разбора SSML в браузерах; 5.2.3 Атрибуты SpeechSynthesisUtterance; Как настроить параметры команд, вызываемых браузером?.

Исходный код Chromium для сокета 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, SPDDataMode mode) Установите режим данных Speech Dispatcher. В настоящее время поддерживается простой текст и 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 для свойства textSpeechSynthesisUtterance используя существующие возможности родной программы, призванной конвертировать текст в речь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 Socket в качестве клиента (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?

Ответы на вопрос(0)

Ваш ответ на вопрос