利用正则表达式改善TTS听书效果

最近一直在用 TTS Server 来听书,这个APP的语音很厉害,可以设置两种不同的声音,分别对应【旁白】和【对话】,听书的时候很有感觉。

在最近的一次听书时发现,它用【双引号“”】来区分【对话】的。

这样,出现了一个问题:书里有很多的名词描述是用【双引号“”】来标记的。

比如下面这一段,第一行用【旁白】和【对话】两种声音来读,听起来十分难受。

武官叫做“指挥使”,一千人为一“军”,武官为“将军”,一万人为“统”。

所以我要把这类的不是【对话功能】的【双引号“”】改成其他的字符,比如:

武官叫做[指挥使],一千人为一[军],武官为[将军],一万人为[统]。

正好初学了一遍正则表达式,就来实操一下。

以下面的文本为例,有点复杂。

大概是些“你好”、“我叫月儿”之类的字句,李森心里嘀咕:“有点不妙啊!”。
武官叫做“指挥使”,一千人为一“军”,武官为“将军”。
“怎么心有点定不住?”洪易定“神”寻思。
说过这句话之后,摆摆手:“去吧。”

通过思考,我用【零宽度断言】的方法,分成几步来实现:

1. 【对话】的结尾都有结束的标点符号,如【。!?…】等,将这类带有结束标点符号的右引号改掉:

正则表达式 负后发断言?<! 

匹配:(?<![。!?,—~…])”
替换:】

改完后结果为(通过editplus查找替换):

大概是些“你好】、“我叫月儿】之类的字句,李森心里嘀咕:“有点不妙啊!”。
武官叫做“指挥使】,一千人为一“军】,武官为“将军】。
“怎么心有点定不住?”洪易定“神】寻思。
说过这句话之后,摆摆手:“去吧。”

2. 再将对应的左引号改掉:

正则表达式 正先行断言?= 查找和符号】相匹配的:

匹配:“(?=.*】)
替换:【

但是,结果不完美,因为正则表达式贪婪匹配,改完后,第三行有问题:

大概是些【你好】、【我叫月儿】之类的字句,李森心里嘀咕:“有点不妙啊!”。
武官叫做【指挥使】,一千人为一【军】,武官为【将军】。
【怎么心有点定不住?”洪易定【神】寻思。    //这行第一个字符不对
说过这句话之后,摆摆手:“去吧。”
我中间也换了几个思路:
比如用负先行断言?! 只查找【左引号“ 】右边不是对应的【右引号”】
匹配:“(?!.*”)    
但这会导致第1行无法匹配。

3. 最好试了好几次,按下面的,把第3行修正过来

正先行断言 ?=

匹配:【(?=.*[。!?,—~…]”)(?!.*“)
替换:“

注:匹配后面的(?!.*“) 不能去掉,不然第1行又会出问题

这中间修改好几次,最终没有问题了,可以安心听书。

@20221128,其实还有匹配中文字符的方式来快速解决:

第1步:

匹配:(?<![。!?,—~…])”
替换:】


第2步:

匹配:“(?=[\u4E00-\u9FA5]+】)
替换:【

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值