TTS_all_in_one / TTSs /reecho_ai.py
jianuo
代码重钩,将功能模块化,使代码高内聚,第耦合
14a6e16
raw
history blame contribute delete
No virus
4.71 kB
import io
import os
import gradio as gr
import requests
from pydub import AudioSegment
from TTSs.base_tts import Base_TTS
class REECHO_TTS(Base_TTS):
available_roles = {}
def get_name(self):
return 'REECHO 睿声'
def get_reecho_ai_name(self, token):
url = 'https://v1.reecho.cn/api/tts/voice'
headers = {
'Content-Type': 'application/json',
'Authorization': f'Bearer {token}'
}
r = requests.get(url, headers=headers).json()
if r['status'] == 200:
role_dict = {}
for i in r['data']:
info_data = [i['id'], i['metadata']['promptMP3StorageUrl'], b'']
if i['metadata']['description'] == '':
role_dict['{}'.format(i['name'])] = info_data
else:
role_dict['{}——{}'.format(i['name'], i['metadata']['description'])] = info_data
return role_dict
else:
return {'获取角色列表失败': ['', '', b''], str(r): ['', '', b'']}
def get_example_audio(self, role):
try:
if self.available_roles[role][2] != b'':
return self.available_roles[role][2]
audio_url = self.available_roles[role][1]
audio_data = requests.get(audio_url).content
self.available_roles[role][2] = audio_data
return audio_data
except Exception as e:
return None
def refresh_roles(self, reecho_api_key):
self.available_roles = self.get_reecho_ai_name(reecho_api_key)
def _get_config_page(self):
with gr.Group(visible=False) as config_reecho_ai:
gr.Markdown('控制台在此:https://dash.reecho.ai/')
with gr.Row():
reecho_api_key = gr.Textbox(label="reecho的API Key(默认为环境变量值)",
placeholder="请输入reecho的API Key",
type="password",
interactive=True,
value=os.environ.get('REECHO_API_KEY', ''),
scale=3)
btn_refush = gr.Button(value="刷新角色列表")
with gr.Row():
randomness = gr.Slider(minimum=0, maximum=100, value=97, step=1, label="多样性",
interactive=True)
stability_boost = gr.Slider(minimum=0, maximum=100, value=0, step=1, label="稳定性过度",
interactive=True)
self.refresh_roles(reecho_api_key.value)
role = gr.Dropdown(choices=self.available_roles.keys(),
value=list(self.available_roles.keys())[0],
label="角色", interactive=True)
example_audio = gr.Audio(label="该角色示例音频", interactive=False,
value=self.get_example_audio(role.value))
role.change(self.get_example_audio,
inputs=[role], outputs=[example_audio])
btn_refush.click(lambda x: (self.refresh_roles(x),
gr.Dropdown(choices=self.available_roles.keys(),
value=list(self.available_roles.keys())[0],
label="角色", interactive=True)
)[-1],
inputs=[reecho_api_key],
outputs=[role])
inputs = [
reecho_api_key, role, randomness, stability_boost
]
return config_reecho_ai, inputs
def _generate(self, text, reecho_api_key, role, randomness, stability_boost):
url = 'https://v1.reecho.cn/api/tts/simple-generate'
headers = {
'Content-Type': 'application/json',
'Authorization': f'Bearer {reecho_api_key}'
}
body = {
'model': 'reecho-neural-voice-001',
'randomness': randomness,
'stability_boost': stability_boost,
'voiceId': self.available_roles[role][0],
'text': text
}
r = requests.post(url, headers=headers, json=body)
if r.status_code != 200:
raise Exception(f'请求失败,HTTP状态码为{r.status_code}\n\n{r.__dict__}')
r = r.json()
mp3_data = requests.get(r['data']['audio']).content
original_audio = AudioSegment.from_file(io.BytesIO(mp3_data), format="mp3")
return original_audio