TTS 最全中文正则化代码:英文处理、数字处理、韵律预测、汉字转拼音

该博客详细介绍了TTS前端处理的全面方法,包括英文词汇的汉化(如google转谷歌、baidu转百度),数字的中文表达(如2020年2月18日转为贰零贰零年贰月拾捌日),以及韵律预测的实现。文中提供了核心源代码,并提到了韵律预测的两个参考模型,但可能需要针对算法进行调整。

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

TTS 最全的前端处理:英文处理、数字处理、韵律预测

简单介绍思路

  • 英文字母(常见的英文字母转汉语比如:google --谷歌、baidu–百度等
  • 时间和数字处理:比如 2020年2月18日:贰零贰零年贰月拾捌日
固话:0595-23865596或23880880。 固话:零五九五二三八六五五九六或二三八八零八八零。
手机:+86 19859213959或15659451527。 手机:八六一九八五九二一三九五九或一五六五九四五一五二七。
分数:32477/76391。 分数:七万六千三百九十一分之三万两千四百七十七。
百分数:80.03%。 百分数:百分之八十点零三。
编号:31520181154418。 编号:三一五二零一八一一五四四一八。
纯数:2983.07克或12345.60米。 纯数:二九八三.零七克或一二三四五.六十米。
日期:1999年2月20日或09年3月15号。 日期:一九九九年二月二十日或零九年三月十五号。
金钱:12块5,34.5元,20.1万 金钱:十二块五,三十四点五元,二十点一万
特殊:O2O或B2C。 特殊:O2O或B2C。
  • 韵律预测:适合参数化方法,不用可以关闭
0 霍思燕#1露背#0秀乳沟#1性感#0惹火
1 也#0可以#1给#0本委员#0反映哟
2 摇篮牌#1钙维健#1婴儿#1配方#0奶粉
3 鄂豫#1鲁皖苏#1局地#0大暴雨
4 以下#1为#0薛蛮子#1观点#0摘要
  • 汉字转拼音

核心源代码

数字核心源代码

# -*- coding:utf-8 -*-
# /usr/bin/python
'''
@Author  :  Errol 
@Describe:  
@Evn     :  
@Date    :   - 
'''
CN_NUM = {
    '〇': 0, '一': 1, '二': 2, '三': 3, '四': 4, '五': 5, '六': 6, '七': 7, '八': 8, '九': 9, '零': 0,
    '壹': 1, '贰': 2, '叁': 3, '肆': 4, '伍': 5, '陆': 6, '柒': 7, '捌': 8, '玖': 9, '貮': 2, '两': 2,
}

CN_UNIT = {
    '十': 10,
    '拾': 10,
    '百': 100,
    '佰': 100,
    '千': 1000,
    '仟': 1000,
    '万': 10000,
    '萬': 10000,
    '亿': 100000000,
    '億': 100000000,
    '兆': 1000000000000,
}


def chinese_to_arabic(cn: str) -> int:
    unit = 0  # current
    ldig = []  # digest
    for cndig in reversed(cn):
        if cndig in CN_UNIT:
            unit = CN_UNIT.get(cndig)
            if unit == 10000 or unit == 100000000:
                ldig.append(unit)
                unit = 1
        else:
            dig = CN_NUM.get(cndig)
            if unit:
                dig *= unit
                unit = 0
            ldig.append(dig)
    if unit == 10:
        ldig.append(10)
    val, tmp = 0, 0
    for x in reversed(ldig):
        if x == 10000 or x == 100000000:
            val += tmp * x
            tmp = 0
        else:
            tmp += x
    val += tmp
    return val


# TODO: make a full unittest


def test():
    test_dig = ['八',
                '十一',
                '一百二十三',
                '一千二百零三',
                '一万零一',
                '十万零三千六百零九',
                '一百二十三万四千五百六十七',
                '一千貮百二十三万四千五百六十七',
                '一亿一千一百二十三万四千五百六十七',
                '一百零二亿五千零一万零一千零三十八',
                '壹万零捌佰玖拾叁']
    for cn in test_dig:
        x = chinese_to_arabic(cn)
        print(cn, x)
    #assert x == 10250011038


if __name__ == '__main__':
    test()

韵律核心源代码

# logits
logits_iph = tf.matmul(h_iph, w_iph) + b_iph  # shape of logits:[batch_size*max_time, 3]
logits_normal_iph = tf.reshape(  # logits in an normal way:[batch_size,max_time_stpes,3]
   tensor=logits_iph,
   shape=(-1, self.max_sentence_size, 3),
   name="logits_normal_iph"
)
logits_iph_masked = tf.boolean_mask(  # [seq_len1+seq_len2+....+,3]
   tensor=logits_normal_iph,
   mask=self.mask,
   name="logits_iph_masked"
)

# prediction
pred_iph = tf.cast(tf.argmax(logits_iph, 1), tf.int32, name="pred_iph")  # pred_iph:[batch_size*max_time,]
pred_normal_iph = tf.reshape(  # pred in an normal way,[batch_size, max_time]
   tensor=pred_iph,
   shape=(-1, self.max_sentence_size),
   name="pred_normal_iph"
)
pred_iph_masked = tf.boolean_mask(  # logits_iph_masked [seq_len1+seq_len2+....+,]
   tensor=pred_normal_iph,
   mask=self.mask,
   name="pred_iph_masked"
)
pred_normal_one_hot_iph = tf.one_hot(  # one-hot the pred_normal:[batch_size, max_time,class_num]
   indices=pred_normal_iph,
   depth=self.class_num,
   name="pred_normal_one_hot_iph"
)

# loss
self.loss_iph = tf.losses.softmax_cross_entropy(
   labels=y_p_iph_masked,
   logits=logits_iph_masked
)

韵律预测

参考:https://github.com/quadrismegistus/prosodic
参考:https://github.com/Helsinki-NLP/prosody

这个两个模型效果还不错,但是都需要对算法做修改。欢迎评论交流。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI拉呱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值