【sparrowhawk】筆記

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 備註
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](

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章