Linux无障碍环境搭建:从零到语音导航全指南
|
凌晨告警,三点半十七分,Orca 进程吃掉 92% CPU,SSH 连上去第一眼就看见 /var/log/at-spi-bus-registry.log 里三百七十二条告警——全是“Could not get object path for bus name”,不是权限问题,是 dbus-daemon 每次重启后没等 AT-SPI 注册完就急着 fork。我原以为是 dbus-config 脚本漏了 wait,结果 grep -r “at-spi” 发现是 gnome-settings-daemon 24.8 里那个叫 atspi_bus_name_acquire 的补丁,在 glib 2.76+ 下压根不重试三次,直接 return NULL。这个我敢打包票,因为 DBA 当时蹲我旁边盯着 top,嘴里嚼着最后一块薄荷糖,说“你再杀一次 orca,它下次启动延迟会多八秒”,他刚说完空调就嗡的一声——那种老式机房顶上悬吊的格力柜机,每次电压波动都会抖一下。 优胜劣汰?对。不是系统淘汰人,是人用脚投票把残缺模块踢出主干。你搭语音导航,不是从“装 Orca 开始”,是从删包开始:先把 pulseaudio-module-x11、brltty-x11、mutter-plugin-gesture-manager 全卸了,这三个玩意儿在 Wayland 下和 at-spi2-core 争 access bridge 通道,争到一半自己挂,但日志里只写“Failed to bind”,不写 bind 给谁了。后端昨天提 PR 改 gnome-orca 的 fallback_tts.py,改了十二行,测试通过,合并进 main —— 结果今天上午发现 Ubuntu 24.04.2 镜像里默认还是跑 gnome-orca 45.3,没带那个 patch,因为镜像构建脚本拉的是 distro archive repo,不是 upstream git tag。这事儿我说不准,反正你别信 changelog 里写的“fixed TTS stall on login screen”。 我试过纯命令行配 speech-dispatcher + festival,十五分钟跑通,语音出来是中文女声夹着俄语重音,查了才发现 festival 配置文件里 zh_CN.locale 默认调的是 cmu_us_rms,但 rms 的 lexicon 没收汉字拼音表——得手动 cp /usr/share/festival/voices/cmu_us_rms/cmulex.rbn /usr/share/festival/voices/cmu_us_rms/zh_CN.rbn,然后 echo "你好" | text2wave -eval "(voice_cmu_us_rms)" -o /tmp/test.wav;可你要是用 espeak-ng,不用配 locale,直接 espeak-ng -v zh -s 140 "你好" 就成。但 espeak-ng 不支持 SSML,也不走 at-spi 总线,Orca 一开它就静音——因为 Orca 默认禁用所有非 AT-SPI 接入的 TTS 引擎。这点文档里不写,代码里藏在 orca/orca/scripts/toolkit/gtkscript.py 第四百一十二行 if not self._useATSPI: raise RuntimeError("Non-ATSPI engine blocked")。我翻了三天才揪出来。 对面工位换拖鞋那个实习生,上周五穿的是蓝色洞洞鞋,今早换成灰白拼接绒面,踩地声音轻了,但键盘敲得更响。他问我:“Orca 能读终端里 ls -l 输出的权限位吗?” 我说能,但他刚试完就喊“为什么 rwx 变成 ‘读 写 执行’而不是‘R W X’?”——因为 gnome-orca 的 braille-table-zh_CN 这个包,把 ASCII 字符全映射成汉字释义,包括 chmod 输出的 r、w、x,而那个表文件 last-modified 是 2022 年十月十七号,作者邮箱是 @debian.org,但 deb-src 仓库里根本找不到对应源码树,只有二进制 deb。这东西没人维护,但它活着,而且活得好好的,就在 /usr/share/speech-dispatcher/conf/clients/brltty.conf 里 default-braille-table zh_CN,你改别的 table,Orca 就拒识 braille 键盘输入。真邪门。 咖啡洒在工牌上了,褐色一圈,盖住右下角二维码。扫不出来,保安不让进B区,我只好绕去C口刷指纹——结果指纹识别器刚好在升级固件,屏保上写着 “Firmware update in progress, please wait (ETA: 12 minutes)”。我就靠墙站着,看玻璃门上反光里的自己,头发乱,眼睛底下两坨青。这时候手机响了,老板打来的,我没接。他要问“无障碍环境交付节点能不能推到十一月”,我知道他真正想问的是“客户演示时万一 VoiceOver 对比起来太卡,法务条款要不要加免责项”。我不能答,因为我刚发现 GNOME 47 下 Orca 对 GTK4.14+ 新增的 AccessibleRange 控件,压根不触发 value-changed 信号,只发 state-changed,但语音引擎监听的是前者——这就导致滑动条数值变,语音没反应。这个问题我在 ticket #gnome/orca/4221 下评论了,没人回。不是没人看,是没人修,因为修了也没人测。这就是优胜劣汰的意思:你得天天测,天天报,天天撕,不然它连“劣”都算不上,它只是不存在而已。 值班表排到十月十二号,我连休两天,调休申请被驳回,理由是“无障碍专项无缓冲期”。我看了眼审批流,驳回人是测试组组长,她前天还在群里说“我们自动化用不了 Orca 的 API,mock 掉得了”,结果 mock 时把 Accessibility.getApplication() 返回值硬塞了个空 dict,导致今天下午 CI 红了十九次,每红一次,Jenkins 就往钉钉机器人发一条 “TTS test fail: TypeError: Cannot read property 'name' of undefined”,没人点开看堆栈,都当是环境问题。这事儿我没管,反正不是我的 pipeline。
文章配图,仅供参考 所以现在你问我怎么从零搭?先卸包,再改三个配置路径,然后把 gnome-orca 的启动延迟加到 18 秒(Systemd service 文件 ExecStartPre=/bin/sleep 18),再把 speech-dispatcher 的 startup-delay 设成 22 秒——不是因为需要,是因为 GNOME 启动序列里那几秒差,必须靠睡眠硬凑。其它?其它你等下一个崩溃点出现再说。我已经在 /etc/systemd/system/orca.service.d/override.conf 里加了 RestartSec=11,不是为了高可用,是为了让它崩完立刻再崩一遍,好让我看清 log 第几行先炸。明天早上九点我要重新编译 at-spi2-core 带 debug-symbol 的版本,顺手看看它到底有没有尝试 connect 到 at-spi-bus 上的那个 socket —— 至于为啥不直接 strace,因为我原以为 strace 就够,结果发现它被 seccomp-profile 给截了,profile 名字叫 gnome-session-default,藏在 /usr/share/security/seccomp.d/ 里第四个文件,md5 是 f3c019e784f9a2b3c7e4a5d6b8c9a7d0,但我不确认这是不是出厂默认值。不管了,先睡四小时。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


Linux深度学习环境搭建:12年架构师排障实录
Linux运维老手也常踩的5个Unix环境搭建坑
嵌入式Linux开发者Unix环境搭建避坑指南
Linux下H5开发环境搭建与数据库配置实践