import random | |
import shutil | |
import os | |
from gradio_client import Client | |
client = Client("http://127.0.0.1:7860/") | |
# How to use this new TTS Client? I leave the gradio api demo page as a reference | |
# client = Client("http://127.0.0.1:7860/") | |
# result = client.predict( | |
# "Howdy!", # str in '请填写您想要转换的文本(中英皆可)' Textbox component | |
# "Bilibili - 一清清清,Bilibili - 一清清清", # str (Option from: [('Bilibili - 一清清清', 'Bilibili - 一清清清'), ('ALL - Bob Sponge', 'ALL - Bob Sponge'), ('ALL - Ariana Grande', 'ALL - Ariana Grande'), ('ALL - Stefanie Sun', 'ALL - Stefanie Sun')]) | |
# in '请选择您的AI歌手(必选)' Dropdown component | |
# "Microsoft Adri Online (Natural) - Afrikaans (South Africa) (Female),Microsoft Adri Online (Natural) - Afrikaans (South Africa) (Female)", # str (Option from: [('Microsoft Adri Online (Natural) - Afrikaans (South Africa) (Female)', 'Microsoft Adri Online (Natural) - Afrikaans (South Africa) (Female)'), ('Microsoft Willem Online (Natural) - Afrikaans (South Africa) (Male)', 'Microsoft Willem Online (Natural) - Afrikaans (South Africa) (Male)'), ('Microsoft Anila Online (Natural) - Albanian (Albania) (Female)', 'Microsoft Anila Online (Natural) - Albanian (Albania) (Female)'), ('Microsoft Ilir Online (Natural) - Albanian (Albania) (Male)', 'Microsoft Ilir Online (Natural) - Albanian (Albania) (Male)'), ('Microsoft Ameha Online (Natural) - Amharic (Ethiopia) (Male)', 'Microsoft Ameha Online (Natural) - Amharic (Ethiopia) (Male)'), ('Microsoft Mekdes Online (Natural) - Amharic (Ethiopia) (Female)', 'Microsoft Mekdes Online (Natural) - Amharic (Ethiopia) (Female)'), | |
# ('Microsoft Amina Online (Natural) - Arabic (Algeria) (Female)', 'Microsoft Amina Online (Natural) - Arabic (Algeria) (Female)'), ('Microsoft Ismael Online (Natural) - Arabic (Algeria) (Male)', 'Microsoft Ismael Online (Natural) - Arabic (Algeria) (Male)'), ('Microsoft Ali Online (Natural) - Arabic (Bahrain) (Male)', 'Microsoft Ali Online (Natural) - Arabic (Bahrain) (Male)'), ('Microsoft Laila Online (Natural) - Arabic (Bahrain) (Female)', 'Microsoft Laila Online (Natural) - Arabic (Bahrain) (Female)'), ('Microsoft Salma Online (Natural) - Arabic (Egypt) (Female)', 'Microsoft Salma Online (Natural) - Arabic (Egypt) (Female)'), ('Microsoft Shakir Online (Natural) - Arabic (Egypt) (Male)', 'Microsoft Shakir Online (Natural) - Arabic (Egypt) (Male)'), ...) | |
# | |
# in '请选择一个相应语言的说话人' Dropdown component | |
# -24, # int | float (numeric value between -24 and 24) | |
# in 'Pitch' Slider component | |
# "pm", # str in 'f0 methods' Radio component | |
# 0, # int | float (numeric value between 0 and 1) | |
# in 'Feature ratio' Slider component | |
# 0, # int | float (numeric value between 0 and 7) | |
# in 'Filter radius' Slider component | |
# 0, # int | float (numeric value between 0 and 1) | |
# in 'Volume envelope mix rate' Slider component | |
# "Disable resampling,Disable resampling", # str (Option from: [('Disable resampling', 'Disable resampling'), ('16000', '16000'), ('22050', '22050'), ('44100', '44100'), ('48000', '48000')]) | |
# in 'Resample rate' Dropdown component | |
# api_name="/tts_conversion" | |
# ) | |
# print(result) | |
TTS_MODELS = { | |
"male":{ | |
"Chinese": "Microsoft Yunyang Online (Natural) - Chinese (Mainland) (Male)", | |
"English": "Microsoft Eric Online (Natural) - English (United States) (Male)", | |
"Japanese": "Microsoft Keita Online (Natural) - Japanese (Japan) (Male)", | |
}, | |
"female":{ | |
"Chinese": "Microsoft Xiaoyi Online (Natural) - Chinese (Mainland) (Female)", | |
"English": "Microsoft Ana Online (Natural) - English (United States) (Female)", | |
"Japanese": "Microsoft Nanami Online (Natural) - Japanese (Japan) (Female)", | |
} | |
} | |
class TTSTalker(): | |
def __init__(self,selected_voice, gender, language) -> None: | |
self.selected_voice = selected_voice | |
self.gender = gender | |
self.language = language | |
def test(self, text, audio_path=None): | |
self.gender = random.choice(['male', 'female']) if self.gender not in TTS_MODELS else self.gender | |
languages = TTS_MODELS[self.gender].keys() | |
self.language = random.choice(languages) if self.language not in languages else self.language | |
tts_model = TTS_MODELS[self.gender][self.language] | |
result = client.predict( | |
text, # str in '请填写您想要转换的文本(中英皆可)' Textbox component | |
self.selected_voice, # str (Option from: [('Bilibili - 一清清清', 'Bilibili - 一清清清'), ('ALL - Bob Sponge', 'ALL - Bob Sponge'), ('ALL - Ariana Grande', 'ALL - Ariana Grande'), ('ALL - Stefanie Sun', 'ALL - Stefanie Sun')]) in '请选择您的AI歌手(必选)' Dropdown component | |
tts_model, # in '请选择一个相应语言的说话人' Dropdown component | |
0, # int | float (numeric value between -24 and 24) in 'Pitch' Slider component | |
"pm", # str in 'f0 methods' Radio component | |
0, # int | float (numeric value between 0 and 1) in 'Feature ratio' Slider component | |
0, # int | float (numeric value between 0 and 7) in 'Filter radius' Slider component | |
0, # int | float (numeric value between 0 and 1) in 'Volume envelope mix rate' Slider component | |
"Disable resampling", # str (Option from: [('Disable resampling', 'Disable resampling'), ('16000','16000'), ('22050', '22050'), ('44100', '44100'), ('48000', '48000')]) in 'Resample rate' Dropdown component | |
api_name="/tts_conversion" | |
) | |
print(result[1]) | |
print(result) | |
if result[1] == 'Success': | |
if not os.path.exists(audio_path): | |
os.makedirs(audio_path) | |
output_path = os.path.join(audio_path, 'tempfile.mp3') | |
print(output_path) | |
shutil.copy(result[0], output_path) | |
return output_path | |
else: | |
raise ValueError("failed with SVC") | |