| from __future__ import annotations |
|
|
| import gradio as gr |
| import spaces |
|
|
| from audio_processing import AudioProcessingError, convert_voice |
|
|
|
|
| DEFAULT_PITCH = 0 |
| DEFAULT_LOW_CUT = 20 |
| DEFAULT_HIGH_CUT = 7_900 |
|
|
|
|
| @spaces.GPU(duration=1) |
| def zero_gpu_startup_probe(): |
| return None |
|
|
|
|
| def run_conversion(audio_input, pitch_semitones, low_cut_hz, high_cut_hz): |
| try: |
| sample_rate, waveform, message = convert_voice( |
| audio_input, |
| pitch_semitones, |
| low_cut_hz, |
| high_cut_hz, |
| ) |
| return (sample_rate, waveform), message |
| except AudioProcessingError as error: |
| return None, str(error) |
| except Exception as error: |
| return None, f"音声変換中にエラーが発生しました: {error}" |
|
|
|
|
| def reset_settings(): |
| return DEFAULT_PITCH, DEFAULT_LOW_CUT, DEFAULT_HIGH_CUT |
|
|
|
|
| with gr.Blocks(title="音声パラメータ実験室") as demo: |
| gr.Markdown( |
| """ |
| # 音声パラメータ実験室 / Voice Parameter Playground |
| |
| 音声をアップロードまたは録音し、声の高さと通過させる周波数帯域を変更できます。 |
| スライダーを調整して「音声を変換」を押してください。 |
| """ |
| ) |
|
|
| audio_input = gr.Audio( |
| label="入力音声", |
| sources=["upload", "microphone"], |
| type="numpy", |
| ) |
|
|
| pitch_slider = gr.Slider( |
| minimum=-12, |
| maximum=12, |
| value=DEFAULT_PITCH, |
| step=1, |
| label="声の高さ(半音)", |
| ) |
| low_cut_slider = gr.Slider( |
| minimum=20, |
| maximum=3_000, |
| value=DEFAULT_LOW_CUT, |
| step=10, |
| label="低域カットオフ周波数(Hz)", |
| ) |
| high_cut_slider = gr.Slider( |
| minimum=500, |
| maximum=7_900, |
| value=DEFAULT_HIGH_CUT, |
| step=100, |
| label="高域カットオフ周波数(Hz)", |
| ) |
|
|
| with gr.Row(): |
| convert_button = gr.Button("音声を変換", variant="primary") |
| reset_button = gr.Button("設定をリセット") |
|
|
| audio_output = gr.Audio(label="加工後音声", type="numpy") |
| status_output = gr.Textbox(label="処理内容またはエラーメッセージ", lines=4) |
|
|
| convert_button.click( |
| fn=run_conversion, |
| inputs=[ |
| audio_input, |
| pitch_slider, |
| low_cut_slider, |
| high_cut_slider, |
| ], |
| outputs=[audio_output, status_output], |
| show_progress=True, |
| ) |
| reset_button.click( |
| fn=reset_settings, |
| inputs=None, |
| outputs=[pitch_slider, low_cut_slider, high_cut_slider], |
| show_progress=False, |
| ) |
|
|
|
|
| if __name__ == "__main__": |
| demo.launch() |
|
|