在windows和linux上使用php将eSpeak转换为mp3(在线文本到语音)

在windows和linux上使用php将eSpeak转换为mp3(在线文本到语音),php,linux,windows,text-to-speech,espeak,Php,Linux,Windows,Text To Speech,Espeak,我想在我的web应用程序中实现简单的文本到语音脚本,该脚本将根据给定的文本动态生成mp3 它需要在以下两种情况下运行: windows上的本地WAMP服务器 还有我的在线linux服务器 eSpeak并没有提供最高的音质,但至少在语言、简单实现和免费方面提供了强大的支持。因此,经过一番挖掘,我意识到将其集成到php中的例子并不多。我得出结论,StackOverflow应该包含一个php文本到语音脚本的简单实现,该脚本使用eSpeak和lame生成mp3。首先,我们需要设置eSpeak和lam

我想在我的web应用程序中实现简单的文本到语音脚本,该脚本将根据给定的文本动态生成mp3

它需要在以下两种情况下运行:

  • windows上的本地WAMP服务器
  • 还有我的在线linux服务器

eSpeak并没有提供最高的音质,但至少在语言、简单实现和免费方面提供了强大的支持。因此,经过一番挖掘,我意识到将其集成到php中的例子并不多。我得出结论,StackOverflow应该包含一个php文本到语音脚本的简单实现,该脚本使用eSpeak和lame生成mp3。

首先,我们需要设置eSpeak和lame的路径。确保两个都已安装。在我的例子中,它看起来是这样的:

$lang_voice = 'en';
$input_text = 'some input text to read';
$file_path = 'voice-cache/output.mp3'
$exe_path = sprintf(COMMAND, $lang_voice, $input_text, $file_path); // fills %s spots
exec($exe_path);
我想,也许有人会觉得这很有用。我正在使用此代码在本地windows wamp服务器和联机linux服务器中生成命令:

// APPLICATION PATHS AND CONFIG
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
    //This is a server using Windows!
    define('ESPEAK', '..\application\libraries\espeak-win\command_line\espeak');
    define('LAME', '..\application\libraries\espeak-win\command_line\lame');
} 
else {
    //This is a server not using Windows!
    define('ESPEAK', '/usr/bin/espeak');
    define('LAME', '/usr/bin/lame');
}
然后,编写自己要执行的命令。我使用了%s点,稍后将用所需的值替换

如果您不需要mp3转换,并且对.wav文件感到满意,只需删除
之后的部分(包括此字符),并用这两个参数
-w所需的文件路径
替换参数
--stdout
。在这种情况下,请确保稍后正确设置%s变量

define('COMMAND', ESPEAK.' --stdout -v %s+m3 -p 60 -a 75 -s 130 "%s" | '.LAME.' --preset voice -q 9 --vbr-new - %s');
然后像这样执行脚本:

$lang_voice = 'en';
$input_text = 'some input text to read';
$file_path = 'voice-cache/output.mp3'
$exe_path = sprintf(COMMAND, $lang_voice, $input_text, $file_path); // fills %s spots
exec($exe_path);
最后一步,只需输出生成的文件:

header('Content-Type: audio/mpeg');
header('Content-Length: '.filesize($file_path));
readfile($file_path);

有没有办法不生成文件而只是播放它?@lewis4uI您可以尝试将文件保存到缓冲区,并直接向客户端提供服务,就像您动态生成文件下载一样。但由于性能问题,我不建议这样做,这样您就无法缓存文件。