|
import re |
|
import requests |
|
import os |
|
import random |
|
import string |
|
from requests_toolbelt.multipart.encoder import MultipartEncoder |
|
|
|
abs_path = os.path.dirname(__file__) |
|
base = "http://127.0.0.1:23456" |
|
|
|
|
|
|
|
def voice_speakers(): |
|
url = f"{base}/voice/speakers" |
|
|
|
res = requests.post(url=url) |
|
json = res.json() |
|
for i in json: |
|
print(i) |
|
for j in json[i]: |
|
print(j) |
|
return json |
|
|
|
|
|
|
|
def voice_vits(text, id=0, format="wav", lang="auto", length=1, noise=0.667, noisew=0.8, max=50): |
|
fields = { |
|
"text": text, |
|
"id": str(id), |
|
"format": format, |
|
"lang": lang, |
|
"length": str(length), |
|
"noise": str(noise), |
|
"noisew": str(noisew), |
|
"max": str(max) |
|
} |
|
boundary = '----VoiceConversionFormBoundary' + ''.join(random.sample(string.ascii_letters + string.digits, 16)) |
|
|
|
m = MultipartEncoder(fields=fields, boundary=boundary) |
|
headers = {"Content-Type": m.content_type} |
|
url = f"{base}/voice" |
|
|
|
res = requests.post(url=url, data=m, headers=headers) |
|
fname = re.findall("filename=(.+)", res.headers["Content-Disposition"])[0] |
|
path = f"{abs_path}/{fname}" |
|
|
|
with open(path, "wb") as f: |
|
f.write(res.content) |
|
print(path) |
|
return path |
|
|
|
|
|
|
|
def voice_hubert_vits(upload_path, id, format="wav", length=1, noise=0.667, noisew=0.8): |
|
upload_name = os.path.basename(upload_path) |
|
upload_type = f'audio/{upload_name.split(".")[1]}' |
|
|
|
with open(upload_path, 'rb') as upload_file: |
|
fields = { |
|
"upload": (upload_name, upload_file, upload_type), |
|
"id": str(id), |
|
"format": format, |
|
"length": str(length), |
|
"noise": str(noise), |
|
"noisew": str(noisew), |
|
} |
|
boundary = '----VoiceConversionFormBoundary' + ''.join(random.sample(string.ascii_letters + string.digits, 16)) |
|
|
|
m = MultipartEncoder(fields=fields, boundary=boundary) |
|
headers = {"Content-Type": m.content_type} |
|
url = f"{base}/voice/hubert-vits" |
|
|
|
res = requests.post(url=url, data=m, headers=headers) |
|
fname = re.findall("filename=(.+)", res.headers["Content-Disposition"])[0] |
|
path = f"{abs_path}/{fname}" |
|
|
|
with open(path, "wb") as f: |
|
f.write(res.content) |
|
print(path) |
|
return path |
|
|
|
|
|
|
|
def voice_w2v2_vits(text, id=0, format="wav", lang="auto", length=1, noise=0.667, noisew=0.8, max=50, emotion=0): |
|
fields = { |
|
"text": text, |
|
"id": str(id), |
|
"format": format, |
|
"lang": lang, |
|
"length": str(length), |
|
"noise": str(noise), |
|
"noisew": str(noisew), |
|
"max": str(max), |
|
"emotion": str(emotion) |
|
} |
|
boundary = '----VoiceConversionFormBoundary' + ''.join(random.sample(string.ascii_letters + string.digits, 16)) |
|
|
|
m = MultipartEncoder(fields=fields, boundary=boundary) |
|
headers = {"Content-Type": m.content_type} |
|
url = f"{base}/voice/w2v2-vits" |
|
|
|
res = requests.post(url=url, data=m, headers=headers) |
|
fname = re.findall("filename=(.+)", res.headers["Content-Disposition"])[0] |
|
path = f"{abs_path}/{fname}" |
|
|
|
with open(path, "wb") as f: |
|
f.write(res.content) |
|
print(path) |
|
return path |
|
|
|
|
|
|
|
def voice_conversion(upload_path, original_id, target_id): |
|
upload_name = os.path.basename(upload_path) |
|
upload_type = f'audio/{upload_name.split(".")[1]}' |
|
|
|
with open(upload_path, 'rb') as upload_file: |
|
fields = { |
|
"upload": (upload_name, upload_file, upload_type), |
|
"original_id": str(original_id), |
|
"target_id": str(target_id), |
|
} |
|
boundary = '----VoiceConversionFormBoundary' + ''.join(random.sample(string.ascii_letters + string.digits, 16)) |
|
m = MultipartEncoder(fields=fields, boundary=boundary) |
|
|
|
headers = {"Content-Type": m.content_type} |
|
url = f"{base}/voice/conversion" |
|
|
|
res = requests.post(url=url, data=m, headers=headers) |
|
|
|
fname = re.findall("filename=(.+)", res.headers["Content-Disposition"])[0] |
|
path = f"{abs_path}/{fname}" |
|
|
|
with open(path, "wb") as f: |
|
f.write(res.content) |
|
print(path) |
|
return path |
|
|
|
|
|
def voice_ssml(ssml): |
|
fields = { |
|
"ssml": ssml, |
|
} |
|
boundary = '----VoiceConversionFormBoundary' + ''.join(random.sample(string.ascii_letters + string.digits, 16)) |
|
|
|
m = MultipartEncoder(fields=fields, boundary=boundary) |
|
headers = {"Content-Type": m.content_type} |
|
url = f"{base}/voice/ssml" |
|
|
|
res = requests.post(url=url, data=m, headers=headers) |
|
fname = re.findall("filename=(.+)", res.headers["Content-Disposition"])[0] |
|
path = f"{abs_path}/{fname}" |
|
|
|
with open(path, "wb") as f: |
|
f.write(res.content) |
|
print(path) |
|
return path |
|
|
|
|
|
def voice_dimensional_emotion(upload_path): |
|
upload_name = os.path.basename(upload_path) |
|
upload_type = f'audio/{upload_name.split(".")[1]}' |
|
|
|
with open(upload_path, 'rb') as upload_file: |
|
fields = { |
|
"upload": (upload_name, upload_file, upload_type), |
|
} |
|
boundary = '----VoiceConversionFormBoundary' + ''.join(random.sample(string.ascii_letters + string.digits, 16)) |
|
|
|
m = MultipartEncoder(fields=fields, boundary=boundary) |
|
headers = {"Content-Type": m.content_type} |
|
url = f"{base}/voice/dimension-emotion" |
|
|
|
res = requests.post(url=url, data=m, headers=headers) |
|
fname = re.findall("filename=(.+)", res.headers["Content-Disposition"])[0] |
|
path = f"{abs_path}/{fname}" |
|
|
|
with open(path, "wb") as f: |
|
f.write(res.content) |
|
print(path) |
|
return path |
|
|
|
|
|
import time |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ssml = """ |
|
<speak lang="auto"> |
|
<voice>这几天心里颇不宁静。</voice> |
|
<voice>今晚在院子里坐着乘凉,忽然想起日日走过的荷塘,在这满月的光里,总该另有一番样子吧。</voice> |
|
<voice>月亮渐渐地升高了,墙外马路上孩子们的欢笑,已经听不见了;</voice> |
|
<voice>妻在屋里拍着闰儿,迷迷糊糊地哼着眠歌。</voice> |
|
<voice>我悄悄地披了大衫,带上门出去。</voice><break time="2s"/> |
|
<voice>沿着荷塘,是一条曲折的小煤屑路。</voice> |
|
<voice>这是一条幽僻的路;白天也少人走,夜晚更加寂寞。</voice> |
|
<voice>荷塘四面,长着许多树,蓊蓊郁郁的。</voice> |
|
<voice>路的一旁,是些杨柳,和一些不知道名字的树。</voice> |
|
<voice>没有月光的晚上,这路上阴森森的,有些怕人。</voice> |
|
<voice>今晚却很好,虽然月光也还是淡淡的。</voice><break time="2s"/> |
|
<voice>路上只我一个人,背着手踱着。</voice> |
|
<voice>这一片天地好像是我的;我也像超出了平常的自己,到了另一个世界里。</voice> |
|
<voice>我爱热闹,也爱冷静;<break strength="x-weak"/>爱群居,也爱独处。</voice> |
|
<voice>像今晚上,一个人在这苍茫的月下,什么都可以想,什么都可以不想,便觉是个自由的人。</voice> |
|
<voice>白天里一定要做的事,一定要说的话,现在都可不理。</voice> |
|
<voice>这是独处的妙处,我且受用这无边的荷香月色好了。</voice> |
|
</speak> |
|
""" |
|
|
|
text = """你知道1+1=几吗?我觉得1+1≠3""" |
|
|
|
t1 = time.time() |
|
|
|
|
|
|
|
|
|
|
|
os.system(voice_vits(text,id=126, format="wav", max=0,noise=0.33,noisew=0.4,lang="zh")) |
|
|
|
t2 = time.time() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|