我做了一个把视频内容转成手语的浏览器插件,现在决定把它开源

3 阅读11分钟

前段时间,我一直在做一个叫 SignBridge 的项目。

它是一个浏览器插件。用户打开视频后,插件会读取网页字幕,或者识别当前视频播放的声音,再通过一个浮在网页上的 3D 虚拟人,把识别到的内容转换成手语动作。

signbridge-demo.png

现在回头看,这个项目最初的想法其实很简单:

我们每天都在看视频,但并不是每个人都能平等地获取视频里的信息。

这件事听起来离普通人很远,真正开始做以后,我才发现,它比我想象中复杂得多,也比我原来理解的更有意义。

1. 为什么要做 SignBridge

现在的视频平台已经成为很多人获取信息的主要方式。

新闻、课程、生活经验、产品教程、娱乐内容,甚至政务和公共服务,都在越来越多地通过视频传播。

对大部分人来说,打开视频、听声音、理解内容,是一件很自然的事情。但对于聋人和听障人士来说,情况并没有这么简单。

有人可能会说:

视频不是有字幕吗?

但字幕并不能解决所有问题。

第一,不是所有视频都有字幕。

很多普通视频、直播、短视频和临时录制的内容都没有完整字幕。有些字幕依赖自动识别,错误比较多;有些只有零散文字,无法完整表达说话内容。

第二,字幕和手语并不是一回事。

对于一部分聋人来说,手语是他们更熟悉、更自然的语言。书面中文和中国手语在表达方式、语序和理解习惯上并不完全相同。

我们不能简单地认为,只要放上一行文字,无障碍问题就已经解决了。

第三,即使有字幕,观看体验也可能并不好。

字幕可能太快、太小,和视频背景混在一起,也可能被弹幕、播放器按钮或广告遮挡。对于长视频、课程和复杂内容,仅靠追逐字幕阅读,理解成本依然很高。

正是因为这些问题,我开始思考:

能不能让一个虚拟手语翻译员出现在网页上,跟着视频内容做手语?

它不需要每个视频网站单独开发,也不局限于某一个平台。只要安装浏览器插件,就能在不同网站上使用。

这就是 SignBridge 最早的出发点。

2. 我原以为只是“让虚拟人动起来”

刚开始做的时候,我把问题想得太简单了。

我以为整个过程大概是:

  1. 识别字幕或者声音;
  2. 找到对应的手语动作;
  3. 让虚拟人把动作播放出来。

但真正开始之后,我发现每一步下面都有很多问题。

最早的虚拟人确实动了,但动作方向完全不对。

有时候手臂伸到背后,有时候双手举到头顶,有时候手臂直接穿过身体。看起来是在做动作,实际上根本无法表达正确含义。

后来换了新的虚拟人模型,又遇到了纹理丢失、人物变形、骨骼名称不同、手指方向错误等问题。

最麻烦的是,人的动作不是简单地把一只手从一个位置移动到另一个位置。

肩膀、上臂、肘部、手腕和手指是连在一起的。只要其中一个关节方向判断错误,最后呈现出来的动作就可能完全相反。

尤其是手语。

普通角色动画里,手指细微的偏差可能不容易被注意。但在手语中,手形、掌心方向、动作位置和运动轨迹都有可能影响含义。

这意味着,虚拟人“动起来”只是第一步。

真正困难的是让它动得准确、自然,并且能够被理解。

3. 最难的不是写代码,而是不断推翻错误认知

这个项目开发过程中,我经历了很多次反复。

有些问题看起来已经修好了,刷新网页后又出现了。

有时候修改手掌方向,却影响了手臂位置;修复了虚拟人的大小,又发现窗口不能拖动;解决了字幕输入,声音识别又无法使用。

最让我印象深刻的是手势方向。

模型里的“前、后、左、右”,不一定和我们看到的人物方向一致。不同虚拟人的初始姿势和骨骼结构也可能不同。

同样一个旋转数值,放在不同模型上,可能得到完全不同的动作。

最开始,我采用不断修改参数、刷新页面、观察结果的方式调试。后来发现,这种方式工作量很大,也很容易重复犯错。

一个动作即使偶然调对了,也不代表下一次还能复用。

于是我开始重新整理整个方案:

  • 记录虚拟人的初始姿势;
  • 统一主要骨骼的名称和方向;
  • 把手形和手臂动作分开管理;
  • 建立动作编辑和录制工具;
  • 为每个动作保存可以重复使用的数据;
  • 让插件和动作编辑器使用同一套动作规则;
  • 增加测试,避免修复一个问题后破坏另一个功能。

这个过程让我意识到,开发无障碍产品不能只追求“能运行”。

如果一个普通功能偶尔出错,用户可能只是觉得不好用。但如果一个手语动作表达了相反的意思,它带来的就不只是体验问题,还可能是信息错误。

所以,这个项目越往后做,我越不敢轻易说它已经完成。

4. SignBridge 现在能做什么

目前,SignBridge 已经可以作为 Chrome 浏览器扩展运行。

安装后,它会在视频网页上显示一个可拖动的虚拟人窗口。

用户可以选择两种内容来源:

第一种:读取网页字幕

如果视频本身提供字幕,SignBridge 会读取字幕内容,并播放词库中已经收录和验证过的手语动作。

第二种:识别当前标签页的声音

如果视频没有字幕,用户可以选择识别视频正在播放的声音。

这里识别的是当前网页标签页的音频,不是电脑麦克风。项目支持浏览器本地识别,也预留了云端识别服务的配置方式。

为了保护隐私,用户可以选择让声音识别尽量在自己的浏览器中完成。

除此之外,项目中还加入了:

  • 姿势编辑器;
  • 动作录制工具;
  • 手语动作词库;
  • 虚拟人模型适配;
  • 动作调试与记录功能;
  • 多视频网站字幕识别;
  • 项目帮助和贡献文档。

不过,我也必须坦诚说明:

SignBridge 目前还不是一个可以准确翻译所有中文内容的完整手语翻译系统。

现阶段,它采用的是经过人工整理和确认的动作词库。遇到已经收录的词语,虚拟人可以播放对应动作;遇到没有收录的内容,则需要继续扩充词库和翻译规则。

我宁愿承认它目前的边界,也不希望用一个看似丰富、实际上可能错误的动作冒充正确翻译。

5. 为什么决定开源

开发到一定阶段后,我越来越清楚地意识到:

这个项目很难只靠一个人完成。

手语不是简单的动作集合。

一个动作是否准确,需要懂中国手语的人确认;一个虚拟人是否自然,需要动画和 3D 模型方面的经验;字幕识别、声音识别、浏览器兼容和无障碍体验,也需要不同领域的人参与。

如果项目一直只放在自己的电脑里,它能覆盖的内容永远非常有限。

所以,我决定把 SignBridge 开源。

开源并不代表项目已经成熟。相反,开源是因为它还有很多需要完善的地方。

我希望未来可以有更多人参与:

  • 聋人和手语使用者帮助判断动作是否准确;
  • 手语教师帮助建立可靠的词汇和句子;
  • 动画设计者帮助改善动作的连贯性;
  • 3D 开发者帮助适配更自然、更轻量的虚拟人;
  • 开发者帮助支持更多视频网站和浏览器;
  • 普通用户帮助发现真实使用场景中的问题。

这个项目真正需要的,不只是更多代码,而是更多真实经验。

6. 开发这个项目后,我对“无障碍”有了新的理解

以前提到无障碍,我容易把它理解成某个额外功能。

比如增加字幕、放大文字、提供语音提示,或者增加一个辅助按钮。

现在我更愿意把无障碍理解为:

一个产品有没有把不同用户真正放进设计范围里。

很多障碍并不是来自人的身体条件,而是来自产品只按照一种使用方式设计。

如果视频只有声音,没有字幕或手语,那么问题不在于用户“听不见”,而在于信息只提供了一种入口。

如果一个网站必须依赖鼠标操作,那么问题也不在于用户“不能使用鼠标”,而在于产品没有提供键盘或辅助设备入口。

技术无法立刻解决所有问题,但它至少可以多搭一座桥。

SignBridge 这个名字,也是从这里来的。

它不是为了代替专业手语翻译员,也不是想用虚拟人解决所有沟通问题。

我更希望它成为一座桥:

让原本只有声音的视频,多一种被理解的方式;让更多开发者意识到,视频无障碍不应该只是播放器下面的一行字幕。

7. 后面准备怎么继续完善

接下来,SignBridge 会重点完善几个方向。

扩充经过验证的手语词库

词汇数量不是唯一目标。

相比快速增加大量动作,我更希望每个动作都能被检查、修正和重复验证。

改进连续表达

目前很多动作仍然以词语为单位播放。后续需要优化动作之间的衔接,让虚拟人的表达更连贯,而不是一个动作结束后再机械地切换到下一个动作。

完善手指和面部表达

手语不只依赖手臂。

手形、掌心方向、身体姿态和面部表情都可能承担信息。未来需要逐步完善这些细节。

支持更多网站和使用场景

SignBridge 的目标不是只服务某一个视频网站。

课程网站、新闻页面、直播平台和其他包含视频的网页,都可能是它的使用场景。

建立更可靠的社区协作方式

后续会进一步完善动作提交规范、测试流程和贡献文档,让参与者能够更容易地添加动作、报告问题并验证结果。

8. 写在最后

SignBridge 现在仍然是一个早期项目。

它会犯错,词库还不够大,动作也需要继续修正。但它至少已经从一个想法,变成了一个可以安装、可以运行、可以继续共同完善的开源项目。

开发过程中,我遇到了很多次“明明已经修好,为什么又坏了”的时刻。

我也曾经怀疑,这个问题是不是比想象中复杂太多。

但当虚拟人第一次根据视频内容做出动作时,我仍然觉得,这件事值得继续做下去。

不是因为虚拟人动了。

而是因为它意味着,一段原本只能通过声音理解的内容,开始有机会通过另一种语言被看见。

项目已经发布在 GitHub:

github.com/feifei9126/…

如果你是聋人、手语使用者、手语教师、动画设计者或开发者,欢迎提出建议,也欢迎参与项目。

SignBridge 还不完整。

但开源以后,它不必只依靠一个人完成。