Spaces:
Paused
Paused
| """ | |
| This module contains the code for the "Multi-step generation" tab. | |
| """ | |
| from typings.extra import TransferUpdateArgs | |
| from functools import partial | |
| import gradio as gr | |
| from backend.generate_song_cover import ( | |
| convert_vocals, | |
| dereverb_vocals, | |
| mix_song_cover, | |
| pitch_shift_background, | |
| postprocess_vocals, | |
| retrieve_song, | |
| separate_main_vocals, | |
| separate_vocals, | |
| ) | |
| from frontend.common import ( | |
| PROGRESS_BAR, | |
| EventArgs, | |
| exception_harness, | |
| setup_consecutive_event_listeners_with_toggled_interactivity, | |
| show_hop_slider, | |
| toggle_visible_component, | |
| update_cached_input_songs, | |
| update_output_audio, | |
| update_song_cover_name, | |
| update_value, | |
| ) | |
| def _update_audio( | |
| num_components: int, output_indices: list[int], file_path: str | |
| ) -> gr.Audio | tuple[gr.Audio, ...]: | |
| """ | |
| Update the value of a subset of `Audio` components to the given audio file path. | |
| Parameters | |
| ---------- | |
| num_components : int | |
| The total number of `Audio` components under consideration. | |
| output_indices : list[int] | |
| Indices of `Audio` components to update the value for. | |
| file_path : str | |
| Path pointing to an audio track to update the indexed `Audio` components with. | |
| Returns | |
| ------- | |
| gr.Audio | tuple[gr.Audio, ...] | |
| Each `Audio` component under consideration | |
| with indexed components updated to the given audio file path. | |
| """ | |
| update_args: list[TransferUpdateArgs] = [{} for _ in range(num_components)] | |
| for index in output_indices: | |
| update_args[index]["value"] = file_path | |
| if num_components == 1: | |
| return gr.Audio(**update_args[0]) | |
| return tuple(gr.Audio(**update_arg) for update_arg in update_args) | |
| def render( | |
| generate_buttons: list[gr.Button], | |
| song_dir_dropdowns: list[gr.Dropdown], | |
| cached_input_songs_dropdown_1click: gr.Dropdown, | |
| cached_input_songs_dropdown_multi: gr.Dropdown, | |
| rvc_model: gr.Dropdown, | |
| intermediate_audio_to_delete: gr.Dropdown, | |
| output_audio_to_remove: gr.Dropdown, | |
| ) -> None: | |
| """ | |
| Render "Multi-step generation" tab. | |
| Parameters | |
| ---------- | |
| generate_buttons : list[gr.Button] | |
| Buttons used for audio generation in the | |
| "One-click generation" tab and the "Multi-step generation" tab. | |
| song_dir_dropdowns : list[gr.Dropdown] | |
| Dropdowns for selecting song directories in the | |
| "Multi-step generation" tab. | |
| cached_input_songs_dropdown_1click : gr.Dropdown | |
| Dropdown for selecting cached input songs in the | |
| "One-click generation" tab. | |
| cached_input_songs_dropdown_multi : gr.Dropdown | |
| Dropdown for selecting cached input songs in the | |
| "Multi-step generation" tab. | |
| rvc_model : gr.Dropdown | |
| Dropdown for selecting voice models in the | |
| "Multi-step generation" tab. | |
| intermediate_audio_to_delete : gr.Dropdown | |
| Dropdown for selecting intermediate audio files to delete in the | |
| "Delete audio" tab. | |
| output_audio_to_remove : gr.Dropdown | |
| Dropdown for selecting output audio files to delete in the | |
| "Delete audio" tab. | |
| """ | |
| with gr.Tab("Multi-step generation"): | |
| ( | |
| retrieve_song_btn, | |
| separate_vocals_btn, | |
| separate_main_vocals_btn, | |
| dereverb_vocals_btn, | |
| convert_vocals_btn, | |
| postprocess_vocals_btn, | |
| pitch_shift_background_btn, | |
| mix_btn, | |
| _, | |
| ) = generate_buttons | |
| ( | |
| separate_vocals_dir, | |
| separate_main_vocals_dir, | |
| dereverb_vocals_dir, | |
| convert_vocals_dir, | |
| postprocess_vocals_dir, | |
| pitch_shift_background_dir, | |
| mix_dir, | |
| ) = song_dir_dropdowns | |
| current_song_dir = gr.State(None) | |
| ( | |
| original_track_output, | |
| vocals_track_output, | |
| instrumentals_track_output, | |
| main_vocals_track_output, | |
| backup_vocals_track_output, | |
| dereverbed_vocals_track_output, | |
| reverb_track_output, | |
| converted_vocals_track_output, | |
| postprocessed_vocals_track_output, | |
| shifted_instrumentals_track_output, | |
| shifted_backup_vocals_track_output, | |
| song_cover_track, | |
| ) = [ | |
| gr.Audio(label=label, type="filepath", interactive=False, render=False) | |
| for label in [ | |
| "Input song", | |
| "Vocals", | |
| "Instrumentals", | |
| "Main vocals", | |
| "Backup vocals", | |
| "De-reverbed vocals", | |
| "Reverb", | |
| "Converted vocals", | |
| "Post-processed vocals", | |
| "Pitch-shifted instrumentals", | |
| "Pitch-shifted backup vocals", | |
| "Song cover", | |
| ] | |
| ] | |
| input_tracks = [ | |
| gr.Audio(label=label, type="filepath", render=False) | |
| for label in [ | |
| "Input song", | |
| "Vocals", | |
| "Vocals", | |
| "Vocals", | |
| "Vocals", | |
| "Instrumentals", | |
| "Backup vocals", | |
| "Main vocals", | |
| "Instrumentals", | |
| "Backup vocals", | |
| ] | |
| ] | |
| ( | |
| original_track_input, | |
| vocals_track_input, | |
| main_vocals_track_input, | |
| dereverbed_vocals_track_input, | |
| converted_vocals_track_input, | |
| instrumentals_track_input, | |
| backup_vocals_track_input, | |
| postprocessed_vocals_track_input, | |
| shifted_instrumentals_track_input, | |
| shifted_backup_vocals_track_input, | |
| ) = input_tracks | |
| transfer_defaults = [ | |
| ["Step 1: input song"], | |
| ["Step 2: vocals"], | |
| ["Step 6: instrumentals"], | |
| ["Step 3: vocals"], | |
| ["Step 6: backup vocals"], | |
| ["Step 4: vocals"], | |
| [], | |
| ["Step 5: vocals"], | |
| ["Step 7: main vocals"], | |
| ["Step 7: instrumentals"], | |
| ["Step 7: backup vocals"], | |
| [], | |
| ] | |
| ( | |
| original_track_transfer_default, | |
| vocals_track_transfer_default, | |
| instrumentals_track_transfer_default, | |
| main_vocals_track_transfer_default, | |
| backup_vocals_track_transfer_default, | |
| dereverbed_vocals_track_transfer_default, | |
| reverb_track_transfer_default, | |
| converted_vocals_track_transfer_default, | |
| postprocessed_vocals_track_transfer_default, | |
| shifted_instrumentals_track_transfer_default, | |
| shifted_backup_vocals_track_transfer_default, | |
| song_cover_track_transfer_default, | |
| ) = transfer_defaults | |
| transfer_output_track_dropdowns = [ | |
| gr.Dropdown( | |
| [ | |
| "Step 1: input song", | |
| "Step 2: vocals", | |
| "Step 3: vocals", | |
| "Step 4: vocals", | |
| "Step 5: vocals", | |
| "Step 6: instrumentals", | |
| "Step 6: backup vocals", | |
| "Step 7: main vocals", | |
| "Step 7: instrumentals", | |
| "Step 7: backup vocals", | |
| ], | |
| label="Transfer to", | |
| info=( | |
| "Select the input track(s) to transfer the output track to once" | |
| " generation completes." | |
| ), | |
| render=False, | |
| type="index", | |
| multiselect=True, | |
| value=value, | |
| ) | |
| for value in transfer_defaults | |
| ] | |
| ( | |
| original_track_transfer_dropdown, | |
| vocals_track_transfer_dropdown, | |
| instrumentals_track_transfer_dropdown, | |
| main_vocals_track_transfer_dropdown, | |
| backup_vocals_track_transfer_dropdown, | |
| dereverbed_vocals_track_transfer_dropdown, | |
| reverb_track_transfer_dropdown, | |
| converted_vocals_track_transfer_dropdown, | |
| postprocessed_vocals_track_transfer_dropdown, | |
| shifted_instrumentals_track_transfer_dropdown, | |
| shifted_backup_vocals_track_transfer_dropdown, | |
| song_cover_track_transfer_dropdown, | |
| ) = transfer_output_track_dropdowns | |
| clear_btns = [gr.Button(value="Reset settings", render=False) for _ in range(8)] | |
| ( | |
| retrieve_song_clear_btn, | |
| separate_vocals_clear_btn, | |
| separate_main_vocals_clear_btn, | |
| dereverb_vocals_clear_btn, | |
| convert_vocals_clear_btn, | |
| postprocess_vocals_clear_btn, | |
| pitch_shift_background_clear_btn, | |
| mix_clear_btn, | |
| ) = clear_btns | |
| with gr.Accordion("Step 0: song retrieval", open=True): | |
| gr.Markdown("") | |
| gr.Markdown("**Inputs**") | |
| with gr.Row(): | |
| with gr.Column(): | |
| song_input_type_dropdown = gr.Dropdown( | |
| [ | |
| "YouTube link/local path", | |
| "Local file/microphone", | |
| "Cached song", | |
| ], | |
| value="YouTube link/local path", | |
| label="Song input type", | |
| type="index", | |
| ) | |
| with gr.Column(): | |
| song_input = gr.Textbox( | |
| label="Song input", | |
| info=( | |
| "Link to a song on YouTube or the full path of a local" | |
| " audio file." | |
| ), | |
| ) | |
| local_file = gr.Audio( | |
| label="Song input", type="filepath", visible=False | |
| ) | |
| cached_input_songs_dropdown_multi.render() | |
| song_input_type_dropdown.input( | |
| partial(toggle_visible_component, 3), | |
| inputs=song_input_type_dropdown, | |
| outputs=[song_input, local_file, cached_input_songs_dropdown_multi], | |
| show_progress="hidden", | |
| ) | |
| local_file.change( | |
| update_value, | |
| inputs=local_file, | |
| outputs=song_input, | |
| show_progress="hidden", | |
| ) | |
| cached_input_songs_dropdown_multi.input( | |
| update_value, | |
| inputs=cached_input_songs_dropdown_multi, | |
| outputs=song_input, | |
| show_progress="hidden", | |
| ) | |
| gr.Markdown("**Outputs**") | |
| original_track_output.render() | |
| original_track_transfer_dropdown.render() | |
| retrieve_song_clear_btn.render() | |
| retrieve_song_clear_btn.click( | |
| lambda: gr.Dropdown(value=original_track_transfer_default), | |
| outputs=[original_track_transfer_dropdown], | |
| show_progress="hidden", | |
| ) | |
| retrieve_song_btn.render() | |
| retrieve_song_event_args_list = [ | |
| EventArgs( | |
| partial( | |
| exception_harness(retrieve_song), progress_bar=PROGRESS_BAR | |
| ), | |
| inputs=[song_input], | |
| outputs=[original_track_output, current_song_dir], | |
| ), | |
| EventArgs( | |
| partial( | |
| update_cached_input_songs, | |
| len(song_dir_dropdowns) + 2, | |
| value_indices=range(len(song_dir_dropdowns) + 1), | |
| ), | |
| inputs=[current_song_dir], | |
| outputs=( | |
| song_dir_dropdowns | |
| + [ | |
| cached_input_songs_dropdown_multi, | |
| cached_input_songs_dropdown_1click, | |
| ] | |
| ), | |
| name="then", | |
| show_progress="hidden", | |
| ), | |
| EventArgs( | |
| partial(update_cached_input_songs, 1, [], [0]), | |
| outputs=[intermediate_audio_to_delete], | |
| name="then", | |
| show_progress="hidden", | |
| ), | |
| EventArgs( | |
| partial(_update_audio, len(input_tracks)), | |
| inputs=[original_track_transfer_dropdown, original_track_output], | |
| outputs=input_tracks, | |
| name="then", | |
| show_progress="hidden", | |
| ), | |
| ] | |
| setup_consecutive_event_listeners_with_toggled_interactivity( | |
| retrieve_song_btn, | |
| retrieve_song_event_args_list, | |
| generate_buttons, | |
| ) | |
| with gr.Accordion("Step 1: vocals/instrumentals separation", open=False): | |
| gr.Markdown("") | |
| gr.Markdown("**Inputs**") | |
| original_track_input.render() | |
| separate_vocals_dir.render() | |
| gr.Markdown("**Outputs**") | |
| with gr.Row(): | |
| with gr.Column(): | |
| vocals_track_output.render() | |
| vocals_track_transfer_dropdown.render() | |
| with gr.Column(): | |
| instrumentals_track_output.render() | |
| instrumentals_track_transfer_dropdown.render() | |
| separate_vocals_clear_btn.render() | |
| separate_vocals_clear_btn.click( | |
| lambda: tuple( | |
| gr.Dropdown(value=value) | |
| for value in [ | |
| vocals_track_transfer_default, | |
| instrumentals_track_transfer_default, | |
| ] | |
| ), | |
| outputs=[ | |
| vocals_track_transfer_dropdown, | |
| instrumentals_track_transfer_dropdown, | |
| ], | |
| show_progress="hidden", | |
| ) | |
| separate_vocals_btn.render() | |
| separate_vocals_event_args_list = [ | |
| EventArgs( | |
| partial( | |
| exception_harness(separate_vocals), progress_bar=PROGRESS_BAR | |
| ), | |
| inputs=[original_track_input, separate_vocals_dir], | |
| outputs=[vocals_track_output, instrumentals_track_output], | |
| ) | |
| ] + [ | |
| EventArgs( | |
| partial(_update_audio, len(input_tracks)), | |
| inputs=[transfer_dropdown, output_track], | |
| outputs=input_tracks, | |
| name="then", | |
| show_progress="hidden", | |
| ) | |
| for transfer_dropdown, output_track in zip( | |
| [ | |
| vocals_track_transfer_dropdown, | |
| instrumentals_track_transfer_dropdown, | |
| ], | |
| [vocals_track_output, instrumentals_track_output], | |
| ) | |
| ] | |
| setup_consecutive_event_listeners_with_toggled_interactivity( | |
| separate_vocals_btn, | |
| separate_vocals_event_args_list, | |
| generate_buttons, | |
| ) | |
| with gr.Accordion("Step 2: main vocals/ backup vocals separation", open=False): | |
| gr.Markdown("") | |
| gr.Markdown("**Inputs**") | |
| vocals_track_input.render() | |
| separate_main_vocals_dir.render() | |
| gr.Markdown("**Outputs**") | |
| with gr.Row(): | |
| with gr.Column(): | |
| main_vocals_track_output.render() | |
| main_vocals_track_transfer_dropdown.render() | |
| with gr.Column(): | |
| backup_vocals_track_output.render() | |
| backup_vocals_track_transfer_dropdown.render() | |
| separate_main_vocals_clear_btn.render() | |
| separate_main_vocals_clear_btn.click( | |
| lambda: tuple( | |
| gr.Dropdown(value=value) | |
| for value in [ | |
| main_vocals_track_transfer_default, | |
| backup_vocals_track_transfer_default, | |
| ] | |
| ), | |
| outputs=[ | |
| main_vocals_track_transfer_dropdown, | |
| backup_vocals_track_transfer_dropdown, | |
| ], | |
| show_progress="hidden", | |
| ) | |
| separate_main_vocals_btn.render() | |
| separate_main_vocals_event_args_list = [ | |
| EventArgs( | |
| partial( | |
| exception_harness(separate_main_vocals), | |
| progress_bar=PROGRESS_BAR, | |
| ), | |
| inputs=[vocals_track_input, separate_main_vocals_dir], | |
| outputs=[main_vocals_track_output, backup_vocals_track_output], | |
| ) | |
| ] + [ | |
| EventArgs( | |
| partial(_update_audio, len(input_tracks)), | |
| inputs=[transfer_dropdown, output_track], | |
| outputs=input_tracks, | |
| name="then", | |
| show_progress="hidden", | |
| ) | |
| for transfer_dropdown, output_track in zip( | |
| [ | |
| main_vocals_track_transfer_dropdown, | |
| backup_vocals_track_transfer_dropdown, | |
| ], | |
| [main_vocals_track_output, backup_vocals_track_output], | |
| ) | |
| ] | |
| setup_consecutive_event_listeners_with_toggled_interactivity( | |
| separate_main_vocals_btn, | |
| separate_main_vocals_event_args_list, | |
| generate_buttons, | |
| ) | |
| with gr.Accordion("Step 3: vocal cleanup", open=False): | |
| gr.Markdown("") | |
| gr.Markdown("**Inputs**") | |
| main_vocals_track_input.render() | |
| dereverb_vocals_dir.render() | |
| gr.Markdown("**Outputs**") | |
| with gr.Row(): | |
| with gr.Column(): | |
| dereverbed_vocals_track_output.render() | |
| dereverbed_vocals_track_transfer_dropdown.render() | |
| with gr.Column(): | |
| reverb_track_output.render() | |
| reverb_track_transfer_dropdown.render() | |
| dereverb_vocals_clear_btn.render() | |
| dereverb_vocals_clear_btn.click( | |
| lambda: tuple( | |
| gr.Dropdown(value=value) | |
| for value in [ | |
| dereverbed_vocals_track_transfer_default, | |
| reverb_track_transfer_default, | |
| ] | |
| ), | |
| outputs=[ | |
| dereverbed_vocals_track_transfer_dropdown, | |
| reverb_track_transfer_dropdown, | |
| ], | |
| show_progress="hidden", | |
| ) | |
| dereverb_vocals_btn.render() | |
| dereverb_vocals_event_args_list = [ | |
| EventArgs( | |
| partial( | |
| exception_harness(dereverb_vocals), progress_bar=PROGRESS_BAR | |
| ), | |
| inputs=[main_vocals_track_input, dereverb_vocals_dir], | |
| outputs=[dereverbed_vocals_track_output, reverb_track_output], | |
| ) | |
| ] + [ | |
| EventArgs( | |
| partial(_update_audio, len(input_tracks)), | |
| inputs=[transfer_dropdown, output_track], | |
| outputs=input_tracks, | |
| name="then", | |
| show_progress="hidden", | |
| ) | |
| for transfer_dropdown, output_track in zip( | |
| [ | |
| dereverbed_vocals_track_transfer_dropdown, | |
| reverb_track_transfer_dropdown, | |
| ], | |
| [dereverbed_vocals_track_output, reverb_track_output], | |
| ) | |
| ] | |
| setup_consecutive_event_listeners_with_toggled_interactivity( | |
| dereverb_vocals_btn, dereverb_vocals_event_args_list, generate_buttons | |
| ) | |
| with gr.Accordion("Step 4: vocal conversion", open=False): | |
| gr.Markdown("") | |
| gr.Markdown("**Inputs**") | |
| dereverbed_vocals_track_input.render() | |
| convert_vocals_dir.render() | |
| with gr.Row(): | |
| rvc_model.render() | |
| pitch_change_octaves = gr.Slider( | |
| -3, | |
| 3, | |
| value=0, | |
| step=1, | |
| label="Pitch shift (octaves)", | |
| info=( | |
| "Shift pitch of converted vocals by number of octaves." | |
| " Generally, use 1 for male-to-female conversions and -1 for" | |
| " vice-versa." | |
| ), | |
| ) | |
| pitch_change_semitones = gr.Slider( | |
| -12, | |
| 12, | |
| value=0, | |
| step=1, | |
| label="Pitch shift (semi-tones)", | |
| info=( | |
| "Shift pitch of converted vocals by number of semi-tones." | |
| " Altering this slightly reduces sound quality." | |
| ), | |
| ) | |
| with gr.Row(): | |
| index_rate = gr.Slider( | |
| 0, | |
| 1, | |
| value=0.5, | |
| label="Index rate", | |
| info=( | |
| "Controls how much of the accent in the voice model to keep in" | |
| " the converted vocals" | |
| ), | |
| ) | |
| filter_radius = gr.Slider( | |
| 0, | |
| 7, | |
| value=3, | |
| step=1, | |
| label="Filter radius", | |
| info=( | |
| "If >=3: apply median filtering to the harvested pitch results." | |
| " Can reduce breathiness" | |
| ), | |
| ) | |
| rms_mix_rate = gr.Slider( | |
| 0, | |
| 1, | |
| value=0.25, | |
| label="RMS mix rate", | |
| info=( | |
| "Control how much to mimic the loudness (0) of the input vocals" | |
| " or a fixed loudness (1)" | |
| ), | |
| ) | |
| protect = gr.Slider( | |
| 0, | |
| 0.5, | |
| value=0.33, | |
| label="Protect rate", | |
| info=( | |
| "Protect voiceless consonants and breath sounds. Set to 0.5 to" | |
| " disable." | |
| ), | |
| ) | |
| with gr.Column(): | |
| f0_method = gr.Dropdown( | |
| ["rmvpe", "mangio-crepe"], | |
| value="rmvpe", | |
| label="Pitch detection algorithm", | |
| info=( | |
| "Best option is rmvpe (clarity in vocals), then" | |
| " mangio-crepe (smoother vocals)" | |
| ), | |
| ) | |
| crepe_hop_length = gr.Slider( | |
| 32, | |
| 320, | |
| value=128, | |
| step=1, | |
| visible=False, | |
| label="Crepe hop length", | |
| info=( | |
| "Lower values leads to longer conversions and higher risk" | |
| " of voice cracks, but better pitch accuracy." | |
| ), | |
| ) | |
| f0_method.change( | |
| show_hop_slider, | |
| inputs=f0_method, | |
| outputs=crepe_hop_length, | |
| show_progress="hidden", | |
| ) | |
| gr.Markdown("**Outputs**") | |
| converted_vocals_track_output.render() | |
| converted_vocals_track_transfer_dropdown.render() | |
| convert_vocals_clear_btn.render() | |
| convert_vocals_clear_btn.click( | |
| lambda: [ | |
| 0, | |
| 0, | |
| 0.5, | |
| 3, | |
| 0.25, | |
| 0.33, | |
| "rmvpe", | |
| 128, | |
| gr.Dropdown(value=converted_vocals_track_transfer_default), | |
| ], | |
| outputs=[ | |
| pitch_change_octaves, | |
| pitch_change_semitones, | |
| index_rate, | |
| filter_radius, | |
| rms_mix_rate, | |
| protect, | |
| f0_method, | |
| crepe_hop_length, | |
| converted_vocals_track_transfer_dropdown, | |
| ], | |
| show_progress="hidden", | |
| ) | |
| convert_vocals_btn.render() | |
| convert_vocals_event_args_list = [ | |
| EventArgs( | |
| partial( | |
| exception_harness(convert_vocals), progress_bar=PROGRESS_BAR | |
| ), | |
| inputs=[ | |
| dereverbed_vocals_track_input, | |
| convert_vocals_dir, | |
| rvc_model, | |
| pitch_change_octaves, | |
| pitch_change_semitones, | |
| index_rate, | |
| filter_radius, | |
| rms_mix_rate, | |
| protect, | |
| f0_method, | |
| crepe_hop_length, | |
| ], | |
| outputs=[converted_vocals_track_output], | |
| ), | |
| EventArgs( | |
| partial(_update_audio, len(input_tracks)), | |
| inputs=[ | |
| converted_vocals_track_transfer_dropdown, | |
| converted_vocals_track_output, | |
| ], | |
| outputs=input_tracks, | |
| name="then", | |
| show_progress="hidden", | |
| ), | |
| ] | |
| setup_consecutive_event_listeners_with_toggled_interactivity( | |
| convert_vocals_btn, convert_vocals_event_args_list, generate_buttons | |
| ) | |
| with gr.Accordion("Step 5: post-processing of vocals", open=False): | |
| gr.Markdown("") | |
| gr.Markdown("**Inputs**") | |
| converted_vocals_track_input.render() | |
| postprocess_vocals_dir.render() | |
| with gr.Row(): | |
| reverb_rm_size = gr.Slider( | |
| 0, | |
| 1, | |
| value=0.15, | |
| label="Room size", | |
| info="The larger the room, the longer the reverb time", | |
| ) | |
| reverb_wet = gr.Slider( | |
| 0, | |
| 1, | |
| value=0.2, | |
| label="Wetness level", | |
| info="Loudness level of converted vocals with reverb", | |
| ) | |
| reverb_dry = gr.Slider( | |
| 0, | |
| 1, | |
| value=0.8, | |
| label="Dryness level", | |
| info="Loudness level of converted vocals without reverb", | |
| ) | |
| reverb_damping = gr.Slider( | |
| 0, | |
| 1, | |
| value=0.7, | |
| label="Damping level", | |
| info="Absorption of high frequencies in the reverb", | |
| ) | |
| gr.Markdown("**Outputs**") | |
| postprocessed_vocals_track_output.render() | |
| postprocessed_vocals_track_transfer_dropdown.render() | |
| postprocess_vocals_clear_btn.render() | |
| postprocess_vocals_clear_btn.click( | |
| lambda: [ | |
| 0.15, | |
| 0.2, | |
| 0.8, | |
| 0.7, | |
| gr.Dropdown(value=postprocessed_vocals_track_transfer_default), | |
| ], | |
| outputs=[ | |
| reverb_rm_size, | |
| reverb_wet, | |
| reverb_dry, | |
| reverb_damping, | |
| postprocessed_vocals_track_transfer_dropdown, | |
| ], | |
| show_progress="hidden", | |
| ) | |
| postprocess_vocals_btn.render() | |
| postprocess_vocals_event_args_list = [ | |
| EventArgs( | |
| partial( | |
| exception_harness(postprocess_vocals), | |
| progress_bar=PROGRESS_BAR, | |
| ), | |
| inputs=[ | |
| converted_vocals_track_input, | |
| postprocess_vocals_dir, | |
| reverb_rm_size, | |
| reverb_wet, | |
| reverb_dry, | |
| reverb_damping, | |
| ], | |
| outputs=[postprocessed_vocals_track_output], | |
| ), | |
| EventArgs( | |
| partial(_update_audio, len(input_tracks)), | |
| inputs=[ | |
| postprocessed_vocals_track_transfer_dropdown, | |
| postprocessed_vocals_track_output, | |
| ], | |
| outputs=input_tracks, | |
| name="then", | |
| show_progress="hidden", | |
| ), | |
| ] | |
| setup_consecutive_event_listeners_with_toggled_interactivity( | |
| postprocess_vocals_btn, | |
| postprocess_vocals_event_args_list, | |
| generate_buttons, | |
| ) | |
| with gr.Accordion("Step 6: pitch shift of background tracks", open=False): | |
| gr.Markdown("") | |
| gr.Markdown("**Inputs**") | |
| with gr.Row(): | |
| instrumentals_track_input.render() | |
| backup_vocals_track_input.render() | |
| pitch_shift_background_dir.render() | |
| pitch_change_semitones_background = gr.Slider( | |
| -12, | |
| 12, | |
| value=0, | |
| step=1, | |
| label="Pitch shift", | |
| info=( | |
| "Shift pitch of instrumentals and backup vocals. Measured in" | |
| " semi-tones." | |
| ), | |
| ) | |
| gr.Markdown("**Outputs**") | |
| with gr.Row(): | |
| with gr.Column(): | |
| shifted_instrumentals_track_output.render() | |
| shifted_instrumentals_track_transfer_dropdown.render() | |
| with gr.Column(): | |
| shifted_backup_vocals_track_output.render() | |
| shifted_backup_vocals_track_transfer_dropdown.render() | |
| pitch_shift_background_clear_btn.render() | |
| pitch_shift_background_clear_btn.click( | |
| lambda: [ | |
| 0, | |
| gr.Dropdown(value=shifted_instrumentals_track_transfer_default), | |
| gr.Dropdown(value=shifted_backup_vocals_track_transfer_default), | |
| ], | |
| outputs=[ | |
| pitch_change_semitones_background, | |
| shifted_instrumentals_track_transfer_dropdown, | |
| shifted_backup_vocals_track_transfer_dropdown, | |
| ], | |
| show_progress="hidden", | |
| ) | |
| pitch_shift_background_btn.render() | |
| pitch_shift_background_event_args_list = [ | |
| EventArgs( | |
| partial( | |
| exception_harness(pitch_shift_background), | |
| progress_bar=PROGRESS_BAR, | |
| ), | |
| inputs=[ | |
| instrumentals_track_input, | |
| backup_vocals_track_input, | |
| pitch_shift_background_dir, | |
| pitch_change_semitones_background, | |
| ], | |
| outputs=[ | |
| shifted_instrumentals_track_output, | |
| shifted_backup_vocals_track_output, | |
| ], | |
| ) | |
| ] + [ | |
| EventArgs( | |
| partial(_update_audio, len(input_tracks)), | |
| inputs=[dropdown, output_track], | |
| outputs=input_tracks, | |
| name="then", | |
| show_progress="hidden", | |
| ) | |
| for dropdown, output_track in zip( | |
| [ | |
| shifted_instrumentals_track_transfer_dropdown, | |
| shifted_backup_vocals_track_transfer_dropdown, | |
| ], | |
| [ | |
| shifted_instrumentals_track_output, | |
| shifted_backup_vocals_track_output, | |
| ], | |
| ) | |
| ] | |
| setup_consecutive_event_listeners_with_toggled_interactivity( | |
| pitch_shift_background_btn, | |
| pitch_shift_background_event_args_list, | |
| generate_buttons, | |
| ) | |
| with gr.Accordion("Step 7: song mixing", open=False): | |
| gr.Markdown("") | |
| gr.Markdown("**Inputs**") | |
| with gr.Row(): | |
| postprocessed_vocals_track_input.render() | |
| shifted_instrumentals_track_input.render() | |
| shifted_backup_vocals_track_input.render() | |
| mix_dir.render() | |
| with gr.Row(): | |
| main_gain = gr.Slider(-20, 20, value=0, step=1, label="Main vocals") | |
| inst_gain = gr.Slider(-20, 20, value=0, step=1, label="Instrumentals") | |
| backup_gain = gr.Slider(-20, 20, value=0, step=1, label="Backup vocals") | |
| with gr.Row(): | |
| output_name = gr.Textbox( | |
| label="Output file name", | |
| placeholder="Ultimate RVC song cover", | |
| ) | |
| output_sr = gr.Dropdown( | |
| choices=[16000, 44100, 48000, 96000, 192000], | |
| value=44100, | |
| label="Output sample rate", | |
| ) | |
| output_format = gr.Dropdown( | |
| ["mp3", "wav", "flac", "aac", "m4a", "ogg"], | |
| value="mp3", | |
| label="Output file format", | |
| ) | |
| postprocessed_vocals_track_input.change( | |
| update_song_cover_name, | |
| inputs=[postprocessed_vocals_track_input, mix_dir], | |
| outputs=output_name, | |
| show_progress="hidden", | |
| ) | |
| mix_dir.change( | |
| update_song_cover_name, | |
| inputs=[postprocessed_vocals_track_input, mix_dir], | |
| outputs=output_name, | |
| show_progress="hidden", | |
| ) | |
| gr.Markdown("**Outputs**") | |
| song_cover_track.render() | |
| song_cover_track_transfer_dropdown.render() | |
| mix_clear_btn.render() | |
| mix_clear_btn.click( | |
| lambda: [ | |
| 0, | |
| 0, | |
| 0, | |
| 44100, | |
| "mp3", | |
| gr.Dropdown(value=song_cover_track_transfer_default), | |
| ], | |
| outputs=[ | |
| main_gain, | |
| inst_gain, | |
| backup_gain, | |
| output_sr, | |
| output_format, | |
| song_cover_track_transfer_dropdown, | |
| ], | |
| show_progress="hidden", | |
| ) | |
| mix_btn.render() | |
| mix_btn_event_args_list = [ | |
| EventArgs( | |
| partial( | |
| exception_harness(mix_song_cover), progress_bar=PROGRESS_BAR | |
| ), | |
| inputs=[ | |
| postprocessed_vocals_track_input, | |
| shifted_instrumentals_track_input, | |
| shifted_backup_vocals_track_input, | |
| mix_dir, | |
| main_gain, | |
| inst_gain, | |
| backup_gain, | |
| output_sr, | |
| output_format, | |
| output_name, | |
| ], | |
| outputs=[song_cover_track], | |
| ), | |
| EventArgs( | |
| partial(update_output_audio, 1, [], [0]), | |
| outputs=[output_audio_to_remove], | |
| name="then", | |
| show_progress="hidden", | |
| ), | |
| EventArgs( | |
| partial(_update_audio, len(input_tracks)), | |
| inputs=[song_cover_track_transfer_dropdown, song_cover_track], | |
| outputs=input_tracks, | |
| name="then", | |
| show_progress="hidden", | |
| ), | |
| ] | |
| setup_consecutive_event_listeners_with_toggled_interactivity( | |
| mix_btn, mix_btn_event_args_list, generate_buttons | |
| ) | |