语音调度器

来自 ArchWiki

语音调度器是语音合成的设备独立层,为客户端应用程序(想要说话的程序)和软件合成器(实际能够将文本转换为语音的程序)提供了一个通用的、易于使用的接口。

它是 Free(b)soft 项目的一部分,该项目旨在使盲人和视障人士能够基于自由软件使用计算机和互联网。

安装

安装 speech-dispatcher 软件包。接下来,安装几个受支持的语音合成器之一。

要使用 Festival,请安装 festival-freebsoft-utilsAUR。按照下面专用部分中的配置说明进行操作。

要使用现代神经文本到语音系统 Piper,请安装 piper-tts-binAUR 和您语言的一种语音包,例如 piper-voices-en-usAUR。配置语音调度器以使用 Piper,如下面专用部分所述。或者,除了上面的 AUR 软件包外,还可以使用 Pied(一个通过 Flatpak 分发的自动化图形安装程序)安装 Piper 以及语音和语音调度器配置。

要使用 eSpeak NG,请安装 espeakup启用该服务。按照下面部分中的配置说明进行操作。

配置

主配置文件位于 /etc/speech-dispatcher/speechd.conf,但是语音调度器通常在每个用户的基础上运行,以允许多个用户拥有不同的首选项。用户配置文件存储在 ~/.config/speech-dispatcher/ 中。还支持允许不同的语音合成引擎客户端也拥有自己的配置。

使用包含的 spd-conf 工具来更改配置选项。默认情况下,它将以交互模式运行,并询问您一系列问题,以生成您需要的文件类型。建议您创建每个用户的配置,除非您绝对确定您将是唯一的用户。更改系统配置需要 root 权限。

基本配置

要使用交互模式并回答有关您需要什么的问题,请运行以下命令

$ spd-conf

要创建每个用户的配置,请运行以下命令

$ spd-conf -uc

要编辑系统范围的配置文件,请运行以下命令

# spd-conf -C

Festival 特定

本文或本节的事实准确性存在争议。

原因:从测试来看,似乎此步骤是不必要的,只要 Festival 作为服务器运行,speech-dispatcher 似乎就可以在没有此编辑的情况下工作。(在 Talk:Speech dispatcher 中讨论)

如果您打算使用 Festival 作为您的语音合成引擎,那么您还应该执行以下操作

$ $EDITOR ~/.config/speech-dispatcher/speechd.conf

找到并取消注释(通过删除行首的 #)以下行

~/.config/speech-dispatcher/speechd.conf
...
#AddModule "festival"
...

然后保存文件。

Piper 特定

语音调度器仅通过通用接口模块支持 Piper,该模块通过自定义 shell 命令进行交互。为此需要音频播放器。对于 Pulseaudio,安装 mpv;对于 ALSA,使用 alsa-utils 中的 aplay

在您的用户语音调度器配置文件中(请参阅前面的部分了解如何创建它),为 Piper 添加模块和配置文件

~/.config/speech-dispatcher/speechd.conf
AddModule "piper-tts-generic" "sd_generic" "piper-tts-generic.conf"

为 Piper 创建以下模块配置文件。在 shell 命令中,编辑模型路径,为您所需的语音选择 /usr/share/piper-voices/ 中的模型,以及适合您的音频后端的音频播放器

~/.config/speech-dispatcher/modules/piper-tts-generic.conf
GenericExecuteSynth "export XDATA=\'$DATA\'; echo \"$XDATA\" | sed -z 's/\\n/ /g' | piper-tts -q -m \"/usr/share/piper-voices/en/en_US/ryan/high/en_US-ryan-high.onnx\" -s 21 -f - | mpv --volume=80 --no-terminal --keep-open=no -"

AddVoice "en-US" "MALE1"   "en_US-ryan-high"

shell 命令需要过滤掉换行符,因为 piper-tts 在换行符处退出。为了完成此操作,输入文本(语音调度器将其替换为 shell 命令中作为 $DATA 占位符字符串的文字字符串)首先被分配给环境变量,然后将变量的内容通过管道传递到 sed 以将换行符替换为空格。

可以使用 $VOICE 变量实现多语音设置。以下示例假定相应的 .onnx.onnx.json 文件放置在扁平目录中

~/.config/speech-dispatcher/modules/piper-tts-generic.conf
GenericExecuteSynth "echo \'$DATA\' | piper-tts --model /path/to/piper-tts-voices/$VOICE -f - | mpv --no-terminal --keep-open=no -"

AddVoice "de-DE" "male1" "de_DE-thorsten-high.onnx"

AddVoice "en-US" "female1" "en_US-lessac-low.onnx"
AddVoice "en-US" "male1" "en_US-ryan-medium.onnx"

DefaultVoice "en_US-lessac-low.onnx"

$VOICE 等于提供给 AddVoice 的第三个参数 - 被认为是语音的“名称” - 并且必须与 .onnx 文件名匹配。如果客户端未显式指定语音,则 $VOICE 等于 no_voice。设置 DefaultVoice 作为备用以应对这种情况。

用法

直接使用语音调度器不是常见的场景,因为它的目的是为其他语音合成引擎提供访问层,也就是说,您可以通过使用包含的 spd-say 二进制文件直接与其交互,如下所示

$ spd-say "Arch Linux is the best"

Firefox 浏览器是支持语音调度器的应用程序之一。切换到阅读器视图 (Ctrl-Alt-R),叙述按钮(耳机图标)应在小菜单中可见。每当语音调度器守护程序启动或重新启动时,您可能需要重新启动 Firefox。

Okular PDF 查看器也支持语音调度器。在“文本选择”模式下选择文本,右键单击它,然后选择“朗读文本”,或在“工具”菜单中选择“朗读当前页面”。每当语音调度器守护程序启动或重新启动时,您可能需要重新启动 Okular。

故障排除

日志

语音调度器很少写入系统日志,但它确实将有用的信息写入其自己的日志。您可以在此命令的输出中找到这些日志的位置

$ /usr/bin/speech-dispatcher -l 3

Spd-conf 测试

spd-conf 包含一个例程来测试语音调度器的操作,您可以使用以下命令运行它

$ spd-conf -d

或使用以下命令获取非常详细的日志转储

$ spd-conf -D

还有其他测试可用,例如测试 AlsaPulseAudioFestival,要查看可用选项的完整列表,请运行以下命令

$ spd-conf --help

大多数可用测试将作为测试例程的一部分运行。

语音调度器启动失败

如果语音调度器启动失败,则上述测试将不起作用。如果您想要比日志中更多的信息,您可以尝试像这样启动服务器

$ /usr/bin/speech-dispatcher -l 3

这会将有关启动过程的信息输出到终端。

使用 TTS 导致虚拟输出模块说出错误消息

本文或本节需要扩充。

原因:可能可以使用 systemd 服务文件自动执行此操作(在 Talk:Speech dispatcher 中讨论)

当语音调度器无法连接到语音合成引擎时,会发生这种情况。如果您正在使用 Festival,则需要将其作为服务器运行,这可以通过以下命令实现

$ festival --server &

另请参阅