БлогNot. Реально ли заставить PHP под Windows сказать текст и сгенерировать звуковой файл...

Реально ли заставить PHP под Windows сказать текст и сгенерировать звуковой файл по-русски?

Если коротко - да, реально, но игра в настоящее время не стоит свеч.

Я действовал так. При установленном XAMPP с PHP 8.X добавил строки

[PHP_COM_DOTNET]
extension=php_com_dotnet.dll

в конец активного файла php.ini (путь к файлу D:\xampp\php\php.ini). Сама dll-библиотека в новых сборках уже есть.

На всякий случай раскомментировал (убрал точку с запятой) также следующие записи секции [COM] файла php.ini (хотя работало и без этого):

[COM]
com.typelib_file = php_com_dotnet.dll
com.allow_dcom = true
com.autoregister_typelib = true
com.autoregister_casesensitive = false
com.autoregister_verbose = true
com.code_page="UTF-8"
Перезапустил Apache. Старт сервера может несколько замедлиться. Вот файл .php в кодировке Юникода UTF-8, который смог сказать голосом и записать WAV-файл, комментарии действий есть в листинге:

<!DOCTYPE html>
<html lang="ru">
 <head>
  <meta charset="UTF-8">
  <title>Голос</title>
 </head>
 <body>
<?php
 $filename = "file.wav"; //Имя файла без пути
 $statement = "Durakov rabota lyubit"; //Текст, который запишем в WAV

 $voice = new COM("SAPI.SpVoice");
 $voice_file_stream = new COM("SAPI.SpVoice");
 $file_stream = new COM("SAPI.SpFileStream");
  // См. https://www.php.net/manual/ru/book.com.php

 $voice->Voice = $voice->GetVoices()->Item(0); //Поставили голос 0
 $voice->Speak($voice->Voice->GetDescription); //Заставили его представиться голосом
  //- сказало, что Ирина, Russian
  
 $file_stream->Format->Type = 19; //Поставили качество аудиовывода
 /*
  Варианты качества (основные):
  11kHz 8Bit Mono = 8
  11kHz 8Bit Stereo = 9
  11kHz 16Bit Mono = 10
  11kHz 16Bit Stereo = 11
  16kHz 8Bit Mono = 16
  16kHz 8Bit Stereo = 17
  16kHz 16Bit Mono = 18;
  16kHz 16Bit Stereo = 19
  32kHz 8Bit Mono = 28
  32kHz 8Bit Stereo = 29
  32kHz 16Bit Mono = 30
  32kHz 16Bit Stereo = 31
 */

 $mode = 3; //Выбрали режим работы с файлом
 /*
  Значения для $mode:
  Read = 0
  ReadWrite = 1
  Create = 2
  CreateForWrite = 3
 */

 $voice_file_stream->Voice = $voice_file_stream->GetVoices()->Item(0); 
  //Пробуем поставить голос для файла
 //$voice_file_stream->Speak($voice_file_stream->Voice->GetDescription); 
  //так он мог бы сказать о себе 

 $voice->Speak('Zapishi menya, loha'); //Сказать перед записью файла

 $file_stream->Open($filename, $mode); //Открыть поток для файла
 $voice_file_stream->AudioOutputStream = $file_stream; //Начать стримить 
 $voice_file_stream->Speak($statement);  //Добавить в файл текст из $statement
 $file_stream->Close; //Закрыть файл

 $voice->Speak('Poluchilos, ha-ha-ha'); //Сказать после записи
?>
</body></html>

Несмотря на то, что голос представился по-русски Ириной (см. в коде), как я понял, нормально произносить записанный по-русски текст подобный код всё равно не будет. Можно подобрать нечто похожее транслитом.

Откуда взялась Ирина?

Вот окно масдайки 10, до которого можно добраться по пути Пуск - Параметры - Время и язык - Язык - Предпочитаемые языки (у русского нет значка "Распознавание речи установлено") - Русский - Параметры - Голосовые функции - Параметры.

Откуда взялась Ирина
Откуда взялась Ирина

Вторая трабла - опять же, насколько я понял, объекты .COM в PHP не могут выполнять файловые операции по сетевым путям, даже при наличии всех необходимых разрешений. Поэтому выходной файл создастся там, где заблагорассудится системе, у меня это произошло в папке d:\xampp.

 Файл .wav ("Дураков работа любит"), который ляпнула "Ирина" этим кодом (162 Кб)

Для Unix-систем всё было бы проще и человечней, мы ограничились бы кодом вида

<?php
 $voice = "espeak";
 $statement = 'Hello World!';
 $save_file_args = '-w HelloWorld.wav';
 exec("$voice '$statement'"); //Сказать
 exec("$voice '$statement' $save_file_args"); //Записать в файл
?>

24.09.2022, 14:35 [289 просмотров]


теги: windows программирование язык php сервер wav unix

К этой статье пока нет комментариев, Ваш будет первым