File size: 5,033 Bytes
14a6e16
c02528e
14a6e16
c02528e
14a6e16
 
 
 
 
 
 
 
 
 
 
 
c02528e
 
 
 
 
 
 
 
 
 
14a6e16
 
c02528e
 
14a6e16
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c02528e
 
 
 
 
 
 
 
 
 
 
 
14a6e16
 
 
 
 
 
 
 
 
 
 
 
 
c02528e
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
import io
import logging
import os
import traceback

import gradio as gr
import scipy.io.wavfile as wavfile
from pydub import AudioSegment

from TTSs.base_tts import Base_TTS


class genshin_local_TTS(Base_TTS):
    def __init__(self):
        if self.is_show():
            try:
                from .genshin_bg import speakers
                from .genshin_bg import languages
                from .genshin_bg import tts_fn
                from .genshin_bg import change_dir

                self.speakers_genshin_local = speakers
                self.languages = languages
                self.genshin_tts_fn = tts_fn
                self.change_dir = change_dir

                logging.info('导入原神本地语音合成模块成功')
            except Exception as e:
                traceback.print_exc()

                logging.error('导入原神本地语音合成模块失败')
                logging.error(e)
        else:
            logging.info('未启用原神本地语音合成模块')

    def is_show(self):
        if os.environ.get('USING_LOCAL', 'false').lower() == 'true':
            return True
        else:
            return False

    def get_name(self):
        return '原神语音合成-local'

    def _get_submit_button(self):
        """
        要求返回1个参数:btn
        btn: gr.Button对象,是提交按钮

        :return: btn
        """
        btn = gr.Button(value="原神语音合成(本地版)", variant="primary", interactive=True, visible=False)
        return btn

    def _get_config_page(self):

        with gr.Group(visible=False) as config_genshin_local:
            gr.Markdown('原作者:红血球AE3803\nhttps://space.bilibili.com/6589795/dynamic')
            with gr.Row():
                speaker_local = gr.Dropdown(choices=self.speakers_genshin_local, value=self.speakers_genshin_local[0],
                                            label="角色",
                                            interactive=True)
                search_local = gr.Textbox(label="搜索角色", lines=1, interactive=True)
                btn2 = gr.Button(value="搜索")
            with gr.Column():
                with gr.Row():
                    sdp_ratio_local = gr.Slider(minimum=0, maximum=1, value=0.5, step=0.1,
                                                label="SDP Ratio",
                                                interactive=True)
                    noise_scale_local = gr.Slider(minimum=0.1, maximum=2, value=0.6, step=0.1,
                                                  label="Noise",
                                                  interactive=True)
                with gr.Row():
                    noise_scale_w_local = gr.Slider(minimum=0.1, maximum=2, value=0.9, step=0.1,
                                                    label="Noise_W",
                                                    interactive=True)
                    length_scale_local = gr.Slider(minimum=0.1, maximum=2, value=1.0, step=0.1,
                                                   label="Length",
                                                   interactive=True)

            language_local = gr.Dropdown(
                choices=self.languages, value=self.languages[0], label="Language", interactive=True
            )

            btn2.click(self.search_speaker, inputs=[search_local], outputs=[speaker_local])

        inputs = [
            speaker_local,
            sdp_ratio_local,
            noise_scale_local,
            noise_scale_w_local,
            length_scale_local,
            language_local
        ]

        return config_genshin_local, inputs

    def _generate(self, text, speaker_local,
                  sdp_ratio_local,
                  noise_scale_local,
                  noise_scale_w_local,
                  length_scale_local,
                  language_local):

        with self.change_dir():
            ori_audio_data = self.genshin_tts_fn(text, speaker_local,
                                                 sdp_ratio_local,
                                                 noise_scale_local,
                                                 noise_scale_w_local,
                                                 length_scale_local,
                                                 language_local,
                                                 None, 'Happy',
                                                 'Text prompt',
                                                 'style_text',
                                                 0.7)[1]

        wav_io = io.BytesIO()
        wavfile.write(wav_io, ori_audio_data[0], ori_audio_data[1])
        wav_io.seek(0)
        original_audio = AudioSegment.from_wav(wav_io)
        return original_audio

    def search_speaker(self, search_value):
        for s in self.speakers_genshin_local:
            if search_value == s:
                return s
        for s in self.speakers_genshin_local:
            if search_value in s:
                return s