Spaces:
Running
Running
| import gradio as gr | |
| import os | |
| import pytz | |
| from datetime import datetime | |
| import pandas as pd | |
| import plotly.express as px | |
| from svc_inference import main | |
| # データの作成 | |
| data = { | |
| 'id': list(range(1, 57)), # 1から56までの数字 | |
| 'x': [ | |
| 28, 25, 5, 12, 8, 2, 0, -20, -15, -12, -20, 8, -30, 25, 0, 0, 2, -25, | |
| -25, 20, 15, -2, 0, 15, -30, 15, 8, 28, -10, -22, 20, 20, 8, 20, 0, | |
| 0, -8, -10, -32, 0, 0, -8, 2, -25, -32, -20, -18, -5, 15, -22, -25, | |
| -28, -30, 10, 25, 28 | |
| ], | |
| 'y': [ | |
| 0, -5, -15, -20, -18, -3, 8, 8, 12, 10, 10, -20, 6, -3, 12, -15, 12, | |
| 17, 10, -8, -15, -22, 8, 15, 10, -15, -18, -10, 8, 5, -10, -8, -25, | |
| -5, -12, 12, 15, 6, 17, -12, -8, -8, 15, 17, 25, 4, 4, 0, 0, -20, | |
| 12, 12, 15, -19, 0, 0 | |
| ] | |
| } | |
| df = pd.DataFrame(data) | |
| def create_plot(): | |
| fig = px.scatter(df, x='x', y='y', text='id', | |
| title='Interactive Numeric Scatter Plot') | |
| # マーカーのスタイルを設定(紫系の色に設定) | |
| fig.update_traces( | |
| marker=dict( | |
| size=10, | |
| color='#663399', # 紫色 | |
| line=dict(color='#4B0082', width=1) # より暗い紫の境界線 | |
| ), | |
| textposition='top center' | |
| ) | |
| # レイアウトの設定 | |
| fig.update_layout( | |
| height=600, | |
| width=800, | |
| clickmode='event+select', | |
| plot_bgcolor='#eeeeee', | |
| paper_bgcolor='white', | |
| xaxis=dict( | |
| showgrid=True, | |
| zeroline=True, | |
| range=[-35, 35] # x軸の範囲を設定 | |
| ), | |
| yaxis=dict( | |
| showgrid=True, | |
| zeroline=True, | |
| range=[-30, 30] # y軸の範囲を設定 | |
| ) | |
| ) | |
| return fig | |
| def run_main(audio_file, shift, speaker_id): | |
| # 固定の引数を設定 | |
| class Args: | |
| pass | |
| args = Args() | |
| args.config = "configs/base.yaml" | |
| args.model = "./vits_pretrain/sovits5.0.pretrain.pth" | |
| speaker_str = f"{speaker_id:04d}" | |
| args.spk = f"./configs/singers/singer{speaker_str}.npy" | |
| args.wave = audio_file | |
| print(audio_file) | |
| args.shift = shift | |
| # オプショナルパラメータのデフォルト値設定 | |
| args.ppg = None | |
| args.vec = None | |
| args.pit = None | |
| args.enable_retrieval = False | |
| args.retrieval_index_prefix = "" | |
| args.retrieval_ratio = 0.5 | |
| args.n_retrieval_vectors = 3 | |
| args.hubert_index_path = None | |
| args.whisper_index_path = None | |
| args.debug = False | |
| # 現在時刻を取得してファイル名を生成 | |
| jst = pytz.timezone('Asia/Tokyo') | |
| now = datetime.now(jst) | |
| date_str = now.strftime("%y%m%d") | |
| time_str = now.strftime("%H%M%S") | |
| output_filename = f"svc_id{speaker_str}_pitch{shift}_speed0_{date_str}_{time_str}.wav" | |
| try: | |
| main(args) | |
| os.rename("svc_out.wav", output_filename) # ファイル名を変更 | |
| return output_filename # 新しいファイル名を返す | |
| except Exception as e: | |
| return None | |
| # Gradio インターフェースの作成 | |
| with gr.Blocks() as demo: | |
| gr.Markdown("# SVC 音声変換システム") | |
| with gr.Row(): | |
| with gr.Column(scale=1.15): | |
| plot = gr.Plot(value=create_plot()) | |
| with gr.Column(scale=1): | |
| # 入力音声のアップロード | |
| input_audio = gr.Audio( | |
| label="変換したい音声をアップロード", | |
| type="filepath" # ファイルパスとして取得 | |
| ) | |
| # Speaker ID の選択 | |
| speaker_id = gr.Number( | |
| label="Speaker ID (1-56)", | |
| value=1, | |
| minimum=1, | |
| maximum=56, | |
| step=1 | |
| ) | |
| # Pitch シフトのスライダー | |
| shift = gr.Slider( | |
| minimum=-12, | |
| maximum=12, | |
| value=0, | |
| step=1, | |
| label="Pitch Shift(-12から+12の半音)" | |
| ) | |
| # ボタン | |
| run_btn = gr.Button(value="音声変換を実行", variant="primary", size="lg") | |
| # 出力表示用 | |
| output_audio = gr.Audio(label="変換後の音声") | |
| run_btn.click( | |
| fn=run_main, | |
| inputs=[input_audio, shift, speaker_id], | |
| outputs=[output_audio] | |
| ) | |
| # アプリケーションの起動 | |
| if __name__ == "__main__": | |
| demo.launch() | |