#tts #questions #japanese #openjtalk #library

jlabel-question

HTS风格的全文标签问题解析器和匹配器

5个版本

0.1.4 2024年3月25日
0.1.3 2024年3月2日
0.1.2 2024年2月6日
0.1.1 2024年2月4日
0.1.0 2024年1月25日

#1230编码


用在 jbonsai

BSD-3-Clause

83KB
2K SLoC

jlabel-question

htsvoice全文标签问题的解析器和匹配器。

注意: serde 的支持是实验性的。更改可能不会被当作破坏性更改处理。

使用

在 Cargo.toml 中添加以下内容

[dependencies]
jlabel-question = "0.1.4"

版权

测试目录中的 question.hed 文件来自 Nitech日本语音数据库 "NIT ATR503 M001"

  • 创用共享许可 3.0
    • 版权 (c) 2003-2015 名古屋工业大学 计算机科学系

许可

BSD-3-Clause

API参考


lib.rs:

HTS风格的全文标签问题解析器和匹配器。

解析和匹配的主要结构是 AllQuestion。它可以解析大多数模式,但不能解析其中一些。有关详细信息,请参阅 将解析作为AllQuestion的条件

use jlabel::Label;
use jlabel_question::{AllQuestion, QuestionMatcher};

use std::str::FromStr;

let question = AllQuestion::parse(&["*/A:-??+*", "*/A:-?+*"])?;
let label_str = concat!(
    "sil^n-i+h=o",
    "/A:-3+1+7",
    "/B:xx-xx_xx",
    "/C:02_xx+xx",
    "/D:02+xx_xx",
    "/E:xx_xx!xx_xx-xx",
    "/F:7_4#0_xx@1_3|1_12",
    "/G:4_4%0_xx_1",
    "/H:xx_xx",
    "/I:3-12@1+2&1-8|1+41",
    "/J:5_29",
    "/K:2+8-41"
);
assert!(question.test(&label_str.parse()?));
#

将解析作为 AllQuestion 的条件

以下是模式成功解析为 AllQuestion 所必需的条件,但即使满足这些要求,某些问题也可能无法成功解析。

  • 模式必须是有效的htsvoice问题模式。
    • 使用 *? 作为通配符,匹配整个全文标签。
    • 在任何情况下都无法匹配全文标签的模式(例如 */A:-?????+*)是不允许的。
    • 数值字段中的减号 (-) 只能在 A 的第一个元素 (A1) 中使用。
  • 所有模式都必须关于相同的位置
    • 例如,第一个模式关于音素的第一元素,第二个模式关于字段 J 的最后一个元素,是不允许的。
  • 每个模式不得在两个或多个位置上有条件。
  • 当模式涉及数值字段的位数(不包括如 BCD 这样的分类字段)时,
    • 模式必须是连续的。

后备

由于 AllQuestion 解析不一定总是成功(即使模式正确),你可能需要为该模式编写后备。

如果你只想忽略这些模式,你可以简单地返回 false 而不是 test() 的结果。

如果你需要成功解析 AllQuestion 解析失败的模式,regex::RegexQuestion 是最佳选择。

use jlabel::Label;
use jlabel_question::{regex::RegexQuestion, AllQuestion, ParseError, QuestionMatcher};

enum Pattern {
    AllQustion(AllQuestion),
    Regex(RegexQuestion),
}
impl Pattern {
    fn parse(patterns: &[&str]) -> Result<Self, ParseError> {
        match AllQuestion::parse(patterns) {
            Ok(question) => Ok(Self::AllQustion(question)),
            Err(_) => Ok(Self::Regex(RegexQuestion::parse(patterns)?)),
        }
    }
    fn test(&self, label: &Label) -> bool {
        match self {
            Self::AllQustion(question) => question.test(label),
            Self::Regex(question) => question.test(label),
        }
    }
}

依赖关系

~0.3–1.5MB
~32K SLoC