1.sparrowhawk
谷歌內部基於WFST的TTS-TN系統Kestrel的開源版本 sparrowhawk,可以支持數字,日期,時間,貨幣,郵箱等多種文本類型的書面語文本轉口語文本
2.sparrowhawk基本工作過程
主要包括兩個模塊
- The tokenizer/classifier
- The verbalizer
2.1.tokenizer / classify模塊
2.1.1.輸入的句子首先根據空格或自定義字符分割成一個個的token,再根據classifier進行分類爲下列幾類(分類規則由thrax語法文件確定 grammars/en_toy/classify/xxx.grm)
- 普通單詞token(不需要進行處理的):
- 普通單詞不進行任何處理
- eg. “apple”、“yes” → “apple” 、“yes”
- 標點符號token(Punctuation):
- sparrowhawk 源碼中默認轉換成 “sil”(silence,即不發音) 源碼 line 157
- eg. “,” 、"?" → sil 、sil
- 需要進行TN處理的token(semiotic classes) sparrowhawk源碼中類型定義
- 自定義的類型,處理成對應的proto格式(見2.1.2)
- Cardinal 整數 1,2,3
- Ordinal 序數 1st,2nd
- Fraction 分數 1/3,2/5
- Time 時間 12:30
- Decimal 十進制數 10.21 ,-11.11 ,12k
- Measure 度量單位 10cm,10kg,100%
- Date 日期 3 Jan. 1980
- Money 貨幣 $10
- Telephone 電話號碼
- Electronic URL地址
- Connector 連接符 1:1,4x3
- Abbreviation 縮寫詞 U.S
- 自定義的類型,處理成對應的proto格式(見2.1.2)
- 未知或者處理失敗的token
- 在verbalize中的verbatim.grm二次處理
2.1.2.token經過classify分類之後,處理成不同的proto格式 ,根據編寫的語法而定 classify_example (其中的 .grm文件爲thrax語法規則,.far文件爲編譯後的FST Arachive文件)
- eg. 貨幣格式 $200 ----→ tokens { money { currency: “usd” amount { integer_part: “200”} } }
- eg. 度量格式 66.66% ----→ tokens { measure { decimal { integer_part: “66” fractional_part: “66”} units: “percent”} }
- eg. 數字格式 12 ----→ tokens { cardinal { integer: “12” } }
- sentence eg. He is 180cm tall
- → 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的格式來進行不同的處理
- eg. cardinal { integer: “13” } ----→ thirteen
- 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
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.語法規則
-
import :
- 導入文件
- import ‘./example.grm’ as e;
- 導入其他grammar文件,導入後,主文件中就可以使用別名來引用函數和符號
-
func :
- 定義一個函數
- eg. func <func_name> [ ]{return <reuturn_fst>}
-
export :
-
生成fst,寫入到 .far文件中後,才能被調用
-
eg**.**
foo = “abc”;
export bar = foo | “xyz”;
-
-
StringFile :
- 加載字符串或者字符串二元組列表,將其中字符編譯成表示這些字符的並集的fst
- 相當於 (“string1 | string2 | string3 | …”)
- StringFile[‘strings_file’, ‘byte’, my_symbols]
-
CDRewrite :
- 用於在給定的上下文字符串中重寫某些詞
- CDRewrite [“s”:“z”,"",“d [EOS]”] ,把字符串末尾的 “d” 前改 “s” 爲 “z”
-
Closure
- 正則中的
- * 匹配0-N個
- + 匹配1-N個
- ? 匹配0-1個
- {a,b} 匹配 a-b個
- eg “xyz”*
-
Concatenation
- 將多個字符拼接 以空格連接
- eg. “a” “b” 即爲(“ab”)
-
Difference
- eg. fst1 - fst2
- 匹配第一個fst且不匹配第二個fst
-
Composition
- eg. fst1 @ fst2
- 將兩個fst拼接,即fst1的輸出作爲fst2的輸入
-
Union
- foo | bar
- 接受兩個中任一個fst,即 或
-
Rewrite
- foo : bar
- 替換,即將 foo 替換爲 bar
-
Weight
- fst
- 指定權重
-
ArcSort
-
- ArcSort[fst, ‘input’|‘output’]
- 對一個FST的所有狀態的所有弧根據弧的輸入或輸出進行排序
-
Connect
- 使得FST變得全連接圖,移除不可達的狀態和路徑
-
CDRewrite
- 給定一個轉換器、2個上下文接收器(以及字母表機),會生成一個在給定上下文中任意位置進行重寫的新FST。
- CDRewrite[“s” : “z”, “”, “d[EOS]”, sigma_star]
- “s” : “z” : 將"s" 替換爲 “z”
- “” : 左上下文爲任意字符匹配
- “d[EOS]” : 右上下文爲以"d"結尾
- sigma_star : 函數是不帶權接收器
-
Determinize
-
- Determinize[fst]
- 確定化一個fst
-
RmEpsilon
- RmEpsilon[fst]
- 將給定fst中的所有epsilon (label 0 )移除
-
Expand
-
- Expand[fst]
- 顯式地將fst展開爲VectorFst
-
Invert
-
- Invert[fst]
- 將給定fst倒置
-
Minimize
- Minimize[fst]
- 最小化fst
-
Optimize
- Optimize[fst]
- 優化 fst ,一般跟export一同使用 export fst_out = Optimize[fst];
-
AssertEqual
- AssertEqual[“dog” @ pluralize, “dogs” ]
- 判斷兩個fst是否相同
4.Google TN開源數據
數據來源:Google採用其內部的TTS系統處理維基百科數據得到的數據
數據描述:token級別的數據,每一行包括
<token的類別(如符號型,數字型,日期型,普通單詞等等)>,<原始token>,<標準化後的token>
各類別數據示例:
類別 | 原始token | 標準化後token | 備註 |
---|---|---|---|
PLAIN | file | 普通字符類 | |
PUNCT | , | sil | 標點符號類,sil表沉默(silence)不發音 |
DATE | December 29, 2012 | december twenty ninth twenty twelve | 日期類,日、月、年 |
LETTERS | Ukh | u k h | 字母類,轉換成逐個字母的發音 |
CARDINAL | 3 | three | 整數類 |
VERBATIM | & | and | 特殊字符類 |
MEASURE | 100 km/h | one hundred kilometers per hour | 度量類 |
ORDINAL | 40th | fortieth | 序數類 |
DECIMAL | 6.395 | six point three nine five | 十進制類 |
MONEY | $13,959 | thirteen thousand nine hundred fifty nine dollars | 貨幣類 |
ELECTRONIC | About.com | a_letter b_letter o_letter u_letter t_letter dot c_letter o_letter m_letter | URL類 |
DIGIT | 2011 | two o one one | 單個數字類,轉換成逐個數字發音 |
TELEPHONE | 1-58705-008-0 | one sil five eight seven o five sil o o eight sil | 電話號碼類 |
TIME | 7:15 AM | seven fifteen a m | 時間類 |
FRACTION | 1/5 | one fifth | 分數類 |
ADDRESS | A728 | a seven two eight | 地址類 |
共分爲100個文件,每個文件包括1100w個token的數據。共11億行。
[RNN Approaches to Text Normalization: A Challenge](