让我们看一下如何使用Piper 、 Piper-whistle 和命名管道设置一个临时的、本地(离线)文本到语音合成器。
为了在基于 GNU/Linux 的系统上设置 Piper,我将描述使用命名管道的通用体系结构,该体系结构足够简单,可以在 Piper 的帮助下进行一些手动设置,从而允许系统范围内的文本到语音转换-口哨和一些小的权衡(很简单,但它不支持并行语音处理)。
首先,让我们从github 上托管的存储库中获取最新的 Piper 独立版本(撰写本文时为2023.11.14-2 )。下载压缩档案后,我们将为 Piper 设置创建一个目录结构。根目录应位于/opt/wind
包含以下子目录:
/opt/wind/piper
(将容纳所建造的 Piper)/opt/wind/channels
(将包含命名管道)
解压后, Piper 可执行文件应位于/opt/wind/piper/piper
,以及随附的库和espeak-ng-data
。
为了管理 Piper 使用的语音模型,我建议使用 Piper-whistle,这是一个用 Python 编写的命令行实用程序,它可以更方便地下载和管理语音。
您可以从其gitlab或github发布页面获取最新的 Wheel 文件。安装wheel文件后,让我们获取一个声音来生成一些语音。首先,我们通过调用piper_whistle -vR
来更新数据库。对于英语演讲,我很喜欢叫alba的女声。使用口哨,我们可以使用piper_whistle list -l en_GB -i 2
列出所有可用的英语 (GB) 语音。声音位于索引 2。因此安装只需调用piper_whistle install en_GB 2
即可。
接下来,让我们创建必要的命名管道。最终的结构将如下所示:
/opt/wind/channels/speak
(接受 JSON 负载)/opt/wind/channels/input
(由 Piper 读取)/opt/wind/channels/ouput
(由 Piper 编写)
要创建命名管道,您可以使用以下命令: mkfifo -m 755 /opt/wind/channels/input
最后,我们在不同的 shell 中创建三个进程:
tail -F /opt/wind/channels/speak | tee /opt/wind/channels/input
/opt/wind/piper/piper -m $(piper_whistle path alba@medium) --debug --json-input --output_raw < /opt/wind/channels/input > /opt/wind/channels/output
aplay --buffer-size=777 -r 22050 -f S16_LE -t raw < /opt/wind/channels/output
tty0 上的进程确保管道保持打开状态,即使在 Piper 或aplay的处理完成后也是如此。这样,我们就可以对 TTS 请求进行排队,然后播放或保存它们。
由于如果您使用上面的结构,piper-whistle 会提供额外的功能,因此我们现在可以通过piper_whistle speak "This is quite neat"
。在具有 X11 的系统上,您可以通过piper_whistle speak "$(xsel --clipboard --output)"
在剪贴板中生成文本的语音版本。