avro-phonetic-go:Avro 风格的 Banglish 到 বাংলা 转写(Go 实现)
Source: Dev.to

如果你的用户是孟加拉语使用者,你一定已经了解这个问题。
人们使用拉丁字母输入孟加拉语。并不是很仔细,也不够统一。但他们仍然期望你的应用能够理解这些输入。
Avro Phonetic 键盘展示了可以通过基于语法的方法来解决此问题:模式匹配结合局部上下文规则。
本文介绍 avro-phonetic-go,一个 Go 库,实现了 Avro 风格的音译引擎,提供干净、面向生产的 API。
设计目标
该库的构建遵循以下原则:
- 基于语法,而非硬编码
- 使用最长匹配扫描实现确定性输出
- 显式的规则评估(前缀和后缀约束)
- 严格模式下不使用任何魔法启发式
- 可选的 BD 模式,支持现代孟加拉国的输入快捷方式
整体思路来源于 Avro Phonetic 键盘。内部设计受到 PHP 参考实现的强烈影响: 。
快速示例
严格模式
fmt.Println(avrophonetic.To("ami bangla gan gai"))
// আমি বাংলা গান গাই
BD 模式(可选)
fmt.Println(avrophonetic.ToBD("tmi valo"))
// তুমি ভালো
工作原理
从宏观上看,引擎分四个步骤工作:
- 加载包含模式和规则的语法
- 构建 Trie 以实现快速最长匹配查找
- 从左到右扫描输入
- 使用局部上下文规则验证候选模式
规则仅针对直接相邻的字符进行评估。没有回溯,这使得算法可预测且高速。
严格模式 vs BD 模式
- 严格模式 作为干净的 Avro 风格基线。当你需要完全一致的 Avro 行为时使用。
- BD 模式 在严格语法之上叠加一小套额外模式,捕捉真实世界中孟加拉国用户的输入习惯,而不污染基础语法。
这种分离让引擎既能满足兼容性需求,也能提升用户体验。
自定义语法支持
引擎完全基于语法驱动。你可以加载完整的语法 JSON 文件,以实现与任意语法的等价:
g, _ := avrophonetic.FromGrammarFile("grammar.json")
a := avrophonetic.New(avrophonetic.WithGrammar(g))
fmt.Println(a.Parse("ami"))
这使得库适用于搜索索引、聊天处理、表单规范化以及 NLP 流水线等场景。
致谢
- Avro Phonetic 键盘:原始创意和语法概念
- PHP 参考实现:
本项目是独立的 Go 实现,未与原始 Avro 项目有任何关联。
结束语
音译是一个小功能,却能产生巨大的影响。如果你的产品需要处理孟加拉语用户输入,做好这件事已经不再是可选项。
Repository:
Documentation and examples are available in the README.