GPT-SoVITS
GPT-SoVITS copied to clipboard
文字包含化学表达式时怎么处理呀
比如硫酸的化学表达式是H₂SO₄
我想这需要用代码做一些替换,比如{"H₂SO₄":"硫酸","HCL":"盐酸"}这样的,替换之后再去推理语音。
因为我在做数学推理的时候,也会有特殊符号,有时候加减乘除就读的很好,有时候上下文不一样,就读错了。
/ 左边这个符号有时候读“除”,有时候读“每”。这个可以理解,毕竟两个意思都对,得看上下文,但为了保证准确,一般会直接替换成对应的汉字。
H₂SO₄这种字符,模型可能比较难找到对应的发音。
@XianYue0125 这是一种办法,但是化学方式太多了,应该是列不全的。
有意思的问题
让GPT给你翻译一遍,然后再做tts推理。
gpt翻译当然最好,但我这边对响应速度有要求,所以更倾向于用代码处理。
我用的是如下这种方式,这只是部分正则的代码,还有一些键值对替换,可以得到还不错的效果,latex用sympy转换成普通公式,然后正则替换一下,把符号换成对应读法,我想化学也可以用类似的方法处理一下。
import re
def replace_zh(input_string): # 专门替换:的?次方,?的绝对值
# 替换^n为 的n次方
def replace_power_n(match):
return "的{}次方".format(match.group(1))
# 替换|x|为 绝对值x
def replace_abs(match):
return "绝对值{}".format(match.group(1))
# 替换log_b(x) 或 log_bx 或 log_b(x/y) 为 以b为底x的对数 或 以b为底(x/y)的对数
def replace_log(match):
base = match.group(1)
number = match.group(2) if match.group(2) else match.group(3)
return "以{}为底{}的对数".format(base, number)
# 使用正则表达式进行替换
# 先处理^n的情况
result = re.sub(r'\^(\w)', replace_power_n, input_string)
# 再处理|x|的情况
result = re.sub(r'\|(\w+)\|', replace_abs, result)
# 处理log_b(x) 和 log_bx 以及 log_b(x/y) 的情况
result = re.sub(r'log_([\w\d])\(([\w\d/]+)\)|log_([\w\d])([\w\d/]+)', replace_log, result)
# 处理Log_aN的情况
result = re.sub(r'Log_(\w)(\w+)', replace_log, result)
return result
测试用例
test_string = "log_2(3/4) |x| ^2 log_a(b) log_c(x/y) ^3 Log_dF" print(replace_zh(test_string))
效果如何吗?这个只要涉及专业词语,数字人基本是废了。