|
from pathlib import Path |
|
|
|
import gradio as gr |
|
from elevenlabslib import * |
|
from elevenlabslib.helpers import * |
|
|
|
params = { |
|
'activate': True, |
|
'api_key': '12345', |
|
'selected_voice': 'None', |
|
} |
|
|
|
initial_voice = ['None'] |
|
wav_idx = 0 |
|
user = ElevenLabsUser(params['api_key']) |
|
user_info = None |
|
|
|
|
|
|
|
def check_valid_api(): |
|
|
|
global user, user_info, params |
|
|
|
user = ElevenLabsUser(params['api_key']) |
|
user_info = user._get_subscription_data() |
|
print('checking api') |
|
if params['activate'] == False: |
|
return gr.update(value='Disconnected') |
|
elif user_info is None: |
|
print('Incorrect API Key') |
|
return gr.update(value='Disconnected') |
|
else: |
|
print('Got an API Key!') |
|
return gr.update(value='Connected') |
|
|
|
|
|
def refresh_voices(): |
|
|
|
global user, user_info |
|
|
|
your_voices = [None] |
|
if user_info is not None: |
|
for voice in user.get_available_voices(): |
|
your_voices.append(voice.initialName) |
|
return gr.Dropdown.update(choices=your_voices) |
|
else: |
|
return |
|
|
|
def remove_surrounded_chars(string): |
|
new_string = "" |
|
in_star = False |
|
for char in string: |
|
if char == '*': |
|
in_star = not in_star |
|
elif not in_star: |
|
new_string += char |
|
return new_string |
|
|
|
def input_modifier(string): |
|
""" |
|
This function is applied to your text inputs before |
|
they are fed into the model. |
|
""" |
|
|
|
return string |
|
|
|
def output_modifier(string): |
|
""" |
|
This function is applied to the model outputs. |
|
""" |
|
|
|
global params, wav_idx, user, user_info |
|
|
|
if params['activate'] == False: |
|
return string |
|
elif user_info == None: |
|
return string |
|
|
|
string = remove_surrounded_chars(string) |
|
string = string.replace('"', '') |
|
string = string.replace('“', '') |
|
string = string.replace('\n', ' ') |
|
string = string.strip() |
|
|
|
if string == '': |
|
string = 'empty reply, try regenerating' |
|
|
|
output_file = Path(f'extensions/elevenlabs_tts/outputs/{wav_idx:06d}.wav'.format(wav_idx)) |
|
voice = user.get_voices_by_name(params['selected_voice'])[0] |
|
audio_data = voice.generate_audio_bytes(string) |
|
save_bytes_to_path(Path(f'extensions/elevenlabs_tts/outputs/{wav_idx:06d}.wav'), audio_data) |
|
|
|
string = f'<audio src="file/{output_file.as_posix()}" controls></audio>' |
|
wav_idx += 1 |
|
return string |
|
|
|
def ui(): |
|
|
|
|
|
with gr.Row(): |
|
activate = gr.Checkbox(value=params['activate'], label='Activate TTS') |
|
connection_status = gr.Textbox(value='Disconnected', label='Connection Status') |
|
voice = gr.Dropdown(value=params['selected_voice'], choices=initial_voice, label='TTS Voice') |
|
with gr.Row(): |
|
api_key = gr.Textbox(placeholder="Enter your API key.", label='API Key') |
|
connect = gr.Button(value='Connect') |
|
|
|
|
|
activate.change(lambda x: params.update({'activate': x}), activate, None) |
|
voice.change(lambda x: params.update({'selected_voice': x}), voice, None) |
|
api_key.change(lambda x: params.update({'api_key': x}), api_key, None) |
|
connect.click(check_valid_api, [], connection_status) |
|
connect.click(refresh_voices, [], voice) |
|
|