GPT-SoVITS icon indicating copy to clipboard operation
GPT-SoVITS copied to clipboard

文字包含化学表达式时怎么处理呀

Open liudiao1992 opened this issue 1 year ago • 5 comments

比如硫酸的化学表达式是H₂SO₄

liudiao1992 avatar Jun 25 '24 07:06 liudiao1992

我想这需要用代码做一些替换,比如{"H₂SO₄":"硫酸","HCL":"盐酸"}这样的,替换之后再去推理语音。

因为我在做数学推理的时候,也会有特殊符号,有时候加减乘除就读的很好,有时候上下文不一样,就读错了。

/ 左边这个符号有时候读“除”,有时候读“每”。这个可以理解,毕竟两个意思都对,得看上下文,但为了保证准确,一般会直接替换成对应的汉字。

H₂SO₄这种字符,模型可能比较难找到对应的发音。

XianYue0125 avatar Jun 26 '24 02:06 XianYue0125

@XianYue0125 这是一种办法,但是化学方式太多了,应该是列不全的。

liudiao1992 avatar Jun 26 '24 03:06 liudiao1992

有意思的问题

RVC-Boss avatar Jun 26 '24 13:06 RVC-Boss

让GPT给你翻译一遍,然后再做tts推理。 image

KevinZhang19870314 avatar Jun 27 '24 10:06 KevinZhang19870314

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))

XianYue0125 avatar Jul 15 '24 08:07 XianYue0125

效果如何吗?这个只要涉及专业词语,数字人基本是废了。

wewaa avatar Jun 16 '25 05:06 wewaa