【sparrowhawk】笔记

Sparrowhawk是谷歌基于WFST的文本转语音(TTS)系统Kestrel的开源版本,专注于书面语文本到口语文本的转换。它包括tokenizer/classifier和Verbalizer两个主要模块,用于处理数字、日期、时间等不同类型的文本。tokenizer/classifier通过tokenizer将输入文本分类并转化为proto格式,Verbalizer则根据proto格式进行进一步处理。Sparrowhawk的使用涉及thrax语法规则和编译流程,可用于构建和测试文本规范化转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.sparrowhawk

谷歌内部基于WFST的TTS-TN系统Kestrel的开源版本 sparrowhawk,可以支持数字,日期,时间,货币,邮箱等多种文本类型的书面语文本转口语文本

安装参考

2.sparrowhawk基本工作过程

主要包括两个模块

  1. The tokenizer/classifier
  2. The verbalizer

2.1.tokenizer / classify模块

2.1.1.输入的句子首先根据空格或自定义字符分割成一个个的token,再根据classifier进行分类为下列几类(分类规则由thrax语法文件确定 grammars/en_toy/classify/xxx.grm)

  1. 普通单词token(不需要进行处理的):
    1. 普通单词不进行任何处理
    2. eg. “apple”、“yes” → “apple” 、“yes”
  2. 标点符号token(Punctuation):
    1. sparrowhawk 源码中默认转换成 “sil”(silence,即不发音) 源码 line 157
    2. eg. “,” 、"?" → sil 、sil
  3. 需要进行TN处理的token(semiotic classes) sparrowhawk源码中类型定义
    1. 自定义的类型,处理成对应的proto格式(见2.1.2)
      1. Cardinal 整数 1,2,3
      2. Ordinal 序数 1st,2nd
      3. Fraction 分数 1/3,2/5
      4. Time 时间 12:30
      5. Decimal 十进制数 10.21 ,-11.11 ,12k
      6. Measure 度量单位 10cm,10kg,100%
      7. Date 日期 3 Jan. 1980
      8. Money 货币 $10
      9. Telephone 电话号码
      10. Electronic URL地址
      11. Connector 连接符 1:1,4x3
      12. Abbreviation 缩写词 U.S
  4. 未知或者处理失败的token
    1. 在verbalize中的verbatim.grm二次处理

2.1.2.token经过classify分类之后,处理成不同的proto格式 ,根据编写的语法而定 classify_example (其中的 .grm文件为thrax语法规则,.far文件为编译后的FST Arachive文件)

  1. eg. 货币格式 $200 ----→ tokens { money { currency: “usd” amount { integer_part: “200”} } }
  2. eg. 度量格式 66.66% ----→ tokens { measure { decimal { integer_part: “66” fractional_part: “66”} units: “percent”} }
  3. eg. 数字格式 12 ----→ tokens { cardinal { integer: “12” } }
  4. sentence eg. He is 180cm tall
    1. → tokens { name: “He” } tokens { name: “is” } tokens { measure { decimal { integer_part: “180”} units: “centimeter”} } tokens { name: “tall” }

2.1.3. demo 编译 及 测试

/sparrowhawk/documentation/grammars/en_toy/classify 文件夹下

$thraxmakedep cardinal.grm

$make

编译完成

测试

thraxrewrite-tester --far=cardinal.far --rules=CARDINAL

$Input string: 13
$Output string: cardinal { integer: “13” }

2.2.Verbalizer

/sparrowhawk/documentation/grammars/en_toy/verbalize 文件夹下

解析classify处理之后的token,根据相应格式处理,具体规则在 .grm中

2.2.1.根据token的格式来进行不同的处理

  1. eg. cardinal { integer: “13” } ----→ thirteen
  2. eg. measure { decimal { integer_part: “100”} units: “kilogram”} ----→ one hundred kilograms

$thraxmakedep measure.grm

$make

$thraxrewrite-tester --far=measure.far --rules=MEASURE

Input string: measure { decimal { integer_part: “100”} units: “kilogram”}
Output string: one hundred kilograms

sparrowhawk官方文档

Peter Ebden and Richard Sproat. 2014. “The Kestrel TTS Text Normalization System.” Journal of Natural Language Engineering.

2.3. Sparrowhawk使用流程

2.3.1编译

主要代码

//引入头文件

#include <sparrowhawk/normalizer.h>

//指定thrax语法库

string grammar_dir = “grammars/”;

//初始化

speech::sparrowhawk::Normalizer normalizer;

//设置配置文件

normalizer.Setup(“sparrowhawk_configuration.ascii_proto”, grammar_dir);

//主程序入口 string in,out

normalizer.Normalize(in, &out);

编译指令

  • 见/data/zhuqing2/project/sparrowhawk/compile_textnormalizer.sh
  • eg.
  • g++ -std=c++11 -I /home/zhuqing2/anaconda2/include -L /home/zhuqing2/anaconda2/lib -lsparrowhawk -lfst -lfstfar -lthrax -lprotobuf -pthread -ldl -lre2 -g -o text_normalizer main.cpp
  • 运行 ./text_normlizer <input_file> <output_file>

3.thrax

The OpenGrm Thrax Grammar Compiler is a set of tools for compiling grammars expressed as regular expressions and context-dependent rewrite rules into weighted finite-state transducers using the OpenFst format.

完整参考 官方文档

例子参考 安装thrax文件夹中 grammars/example.grm

3.1.语法规则

  1. import :

    1. 导入文件
    2. import ‘./example.grm’ as e;
    3. 导入其他grammar文件,导入后,主文件中就可以使用别名来引用函数和符号
  2. func :

    1. 定义一个函数
    2. eg. func <func_name> [ ]{return <reuturn_fst>}
  3. export :

    1. 生成fst,写入到 .far文件中后,才能被调用

    2. eg**.**

      foo = “abc”;

      export bar = foo | “xyz”;

  4. StringFile :

    1. 加载字符串或者字符串二元组列表,将其中字符编译成表示这些字符的并集的fst
    2. 相当于 (“string1 | string2 | string3 | …”)
    3. StringFile[‘strings_file’, ‘byte’, my_symbols]
  5. CDRewrite :

    1. 用于在给定的上下文字符串中重写某些词
    2. CDRewrite [“s”:“z”,"",“d [EOS]”] ,把字符串末尾的 “d” 前改 “s” 为 “z”
  6. Closure

    1. 正则中的
    2. * 匹配0-N个
    3. + 匹配1-N个
    4. ? 匹配0-1个
    5. {a,b} 匹配 a-b个
    6. eg “xyz”*
  7. Concatenation

    1. 将多个字符拼接 以空格连接
    2. eg. “a” “b” 即为(“ab”)
  8. Difference

    1. eg. fst1 - fst2
    2. 匹配第一个fst且不匹配第二个fst
  9. Composition

    1. eg. fst1 @ fst2
    2. 将两个fst拼接,即fst1的输出作为fst2的输入
  10. Union

    1. foo | bar
    2. 接受两个中任一个fst,即 或
  11. Rewrite

    1. foo : bar
    2. 替换,即将 foo 替换为 bar
  12. Weight

    1. fst
    2. 指定权重
  13. ArcSort

    1. ArcSort[fst, ‘input’|‘output’]
    2. 对一个FST的所有状态的所有弧根据弧的输入或输出进行排序
  14. Connect

    1. 使得FST变得全连接图,移除不可达的状态和路径
  15. CDRewrite

    1. 给定一个转换器、2个上下文接收器(以及字母表机),会生成一个在给定上下文中任意位置进行重写的新FST。
    2. CDRewrite[“s” : “z”, “”, “d[EOS]”, sigma_star]
    3. “s” : “z” : 将"s" 替换为 “z”
    4. “” : 左上下文为任意字符匹配
    5. “d[EOS]” : 右上下文为以"d"结尾
    6. sigma_star : 函数是不带权接收器
  16. Determinize

    1. Determinize[fst]
    2. 确定化一个fst
  17. RmEpsilon

    1. RmEpsilon[fst]
    2. 将给定fst中的所有epsilon (label 0 )移除
  18. Expand

    1. Expand[fst]
    2. 显式地将fst展开为VectorFst
  19. Invert

    1. Invert[fst]
    2. 将给定fst倒置
  20. Minimize

    1. Minimize[fst]
    2. 最小化fst
  21. Optimize

    1. Optimize[fst]
    2. 优化 fst ,一般跟export一同使用 export fst_out = Optimize[fst];
  22. AssertEqual

    1. AssertEqual[“dog” @ pluralize, “dogs” ]
    2. 判断两个fst是否相同

4.Google TN开源数据

数据来源:Google采用其内部的TTS系统处理维基百科数据得到的数据

数据描述:token级别的数据,每一行包括

<token的类别(如符号型,数字型,日期型,普通单词等等)>,<原始token>,<标准化后的token>

各类别数据示例:

类别原始token标准化后token备注
PLAINfile普通字符类
PUNCT,sil标点符号类,sil表沉默(silence)不发音
DATEDecember 29, 2012december twenty ninth twenty twelve日期类,日、月、年
LETTERSUkhu k h字母类,转换成逐个字母的发音
CARDINAL3three整数类
VERBATIM&and特殊字符类
MEASURE100 km/hone hundred kilometers per hour度量类
ORDINAL40thfortieth序数类
DECIMAL6.395six point three nine five十进制类
MONEY$13,959thirteen thousand nine hundred fifty nine dollars货币类
ELECTRONICAbout.coma_letter b_letter o_letter u_letter t_letter dot c_letter o_letter m_letterURL类
DIGIT2011two o one one单个数字类,转换成逐个数字发音
TELEPHONE1-58705-008-0one sil five eight seven o five sil o o eight sil电话号码类
TIME7:15 AMseven fifteen a m时间类
FRACTION1/5one fifth分数类
ADDRESSA728a seven two eight地址类

共分为100个文件,每个文件包括1100w个token的数据。共11亿行。

[RNN Approaches to Text Normalization: A Challenge](

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值