Реально ли заставить 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 [406 просмотров]