File size: 2,803 Bytes
704d09b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import gradio as gr
import os
import tempfile
import requests
from langs import langs
from speakers import match_speakers
from languages import UText

header_markdown = f"""
<div align="center">
# {UText("Gradio 版 OpenAI/Edge 文字转语音")}
</div>
"""

def generate_voice(voice, text):
    print(voice,text)
    voice = voice.split('  #')[0]

    if not text:
        gr.Warning(UText("没有文本"))
        return None
    if not voice:
        gr.Warning(UText("请选择发音人"))
        return None
    key = os.getenv("KEY")
    API = os.getenv("API")
    if not API:
        API = "http://171.115.221.19:18503/freeTTS"
    url = f"{API}/{voice}"
    print(url)

    headers = {
        'Authorization': f'Bearer {key}'
    }
    params = {'text': text}

    response = requests.get(url, headers=headers, params=params)

    if response.status_code == 200:
        # Success
        print(f"{voice}: \n{text} ")
        if len(response.content) == 0:
            gr.Warning(UText("声音文件为空"))
            return None
        # Save the received content as an MP3 file 
        with tempfile.NamedTemporaryFile(suffix=".mp3", delete=False) as temp_file:
            temp_file.write(response.content)
            temp_file_path = temp_file.name
            return temp_file_path
    else:
        # Error handling
        print(f"Error: {response.status_code}")
        gr.Warning(f"{response.json()}")
        print(response.json())  # You can also check the error details
        gr.Error(UText("遇到未知错误,联系作者处理"))
        return None

def lang_chose_select(lang_chose,sex):
    return gr.Dropdown(choices=match_speakers(langs=lang_chose,sex=sex), label=UText('选择发音人'), value='',scale=6)
    
with gr.Blocks() as demo:
    gr.Markdown(header_markdown)
    text = gr.TextArea(label=UText("文本"), placeholder=UText("在这里输入文本"))
    with gr.Row():
        lang_chose = gr.Dropdown(choices=langs, label=UText('选择语言'), value=["Chinese"], multiselect=True,scale=12)
        sex = gr.Dropdown(choices=["Male","Female"], label=UText('选择性别'), value=["Male","Female"], multiselect=True,scale=6)
        voice = gr.Dropdown(choices=match_speakers(langs=["Chinese"],sex=["Male","Female"]), label=UText('选择发音人'), value='',scale=6)
        btn = gr.Button(UText("合成的语音"),scale=4)

    with gr.Row():
        output_audio = gr.Audio(label=UText("合成的语音"))
        gr.Markdown(UText("tailer_markdown"))
    
    lang_chose.select(lang_chose_select,inputs=[lang_chose,sex], outputs=voice)
    sex.select(lang_chose_select,inputs=[lang_chose,sex], outputs=voice)
    btn.click(fn=generate_voice, inputs=[voice,text], outputs=output_audio, api_name="tts_button", concurrency_limit=None)

demo.launch()