Spaces:
Runtime error
Runtime error
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 | |