我刚刚注意到有这个:Okular 中的“朗读文字”功能无法使用。如何才能让它正常工作?
我们是否有一个无需通过 repos、snap 或 flatpak 安装 KDE 平台的 Gnome 解决方案?
答案1
我已经设置了语音调度程序(目前还不理想——有些地方的文档有点单薄),但 spd-say 对我来说是可行的。如果该命令对您有用,那么您可以尝试我的解决方案。我在 ~/.local/bin 中创建了两个名为 talk-selection 和 shutter 的小 shell 脚本。无论我使用什么桌面环境或窗口管理器,我都可以将它们绑定到自定义按键(在我的情况下分别是 alt-super-z 和 alt-super-x),我应该会得到所需的效果。我已将它们都作为脚本完成,以防我有理由更改如何它们不仅有效,而且让我能够在其他平台上实现替代方案而不必改变我的想法。
以下是 ~/.local/bin/speak-selection 的内容:
#! /bin/sh
xclip -o | sed -e 's/^!-!/ !-!/g' -e '$a\' | spd-say -e -w
xclip 的手册页告诉我们,默认情况下,它会读取 XA_PRIMARY 选择缓冲区。xterms 中的经典 X11 行为(能够选择文本“复制”并单击鼠标中键“粘贴”)基于 XA_PRIMARY 选择缓冲区。大多数现代 DE 实际上希望您使用实际的剪贴板 (XA_CLIPBOARD),因为您有三个可以像剪贴板一样工作的东西这一概念是诡异的,但我们正在利用它。
sed 命令会稍微清理一下选择缓冲区的内容。sed 有两个表达式 (-e),它们:
如果一行以 !-! 开头,后面的内容将被解释为 SSIP 命令(更改音调、速率、音量等),而我基本上不希望在选择内容中出现这种情况,因此如果出现这种情况,我会在前面添加一个空格来消除它。
如果输入的最后一行没有换行符,则会添加一个换行符。这有必要吗?我不确定。我想我是在试图弄清楚语音被切断的原因时添加的,我不确定是在我意识到我基本上一直想要 -w 之前还是之后添加的,但这似乎没什么坏处。
最后,结果通过管道传输到 spd-say -e -w,它会说出 stdin 并等待语音调度程序完成此操作后再退出,从而避免语音被切断。
~/.local/bin/shutup 的内容很简单:
#! /bin/sh
spd-say -C
你永远不想在没有“闭嘴”功能的情况下实现“开始说话”功能。问问任何使用过语音合成的盲人,他们都会告诉你这是一项必不可少的功能。