Spaces:
Paused
Paused
| import argparse | |
| from backend.generate_song_cover import run_pipeline | |
| if __name__ == "__main__": | |
| parser = argparse.ArgumentParser( | |
| description="Generate a cover song in the song_output/id directory.", | |
| add_help=True, | |
| ) | |
| parser.add_argument( | |
| "-i", | |
| "--song-input", | |
| type=str, | |
| required=True, | |
| help=( | |
| "Link to a song on YouTube, the full path of a local audio file or a cached" | |
| " input song" | |
| ), | |
| ) | |
| parser.add_argument( | |
| "-dir", | |
| "--rvc-dirname", | |
| type=str, | |
| required=True, | |
| help=( | |
| "Name of the folder in the models/rvc directory containing the RVC model" | |
| " file and optional index file to use" | |
| ), | |
| ) | |
| parser.add_argument( | |
| "-pv", | |
| "--pitch-change-vocals", | |
| type=int, | |
| required=True, | |
| help=( | |
| "Shift the pitch of converted vocals only. Measured in octaves. Generally," | |
| " use 1 for male to female and -1 for vice-versa." | |
| ), | |
| ) | |
| parser.add_argument( | |
| "-pall", | |
| "--pitch-change-all", | |
| type=int, | |
| default=0, | |
| help=( | |
| "Shift pitch of converted vocals, backup vocals and instrumentals. Measured" | |
| " in semi-tones. Altering this slightly reduces sound quality" | |
| ), | |
| ) | |
| parser.add_argument( | |
| "-ir", | |
| "--index-rate", | |
| type=float, | |
| default=0.5, | |
| help=( | |
| "A decimal number e.g. 0.5, used to reduce/resolve the timbre leakage" | |
| " problem. If set to 1, more biased towards the timbre quality of the" | |
| " training dataset" | |
| ), | |
| ) | |
| parser.add_argument( | |
| "-fr", | |
| "--filter-radius", | |
| type=int, | |
| default=3, | |
| help=( | |
| "A number between 0 and 7. If >=3: apply median filtering to the harvested" | |
| " pitch results. The value represents the filter radius and can reduce" | |
| " breathiness." | |
| ), | |
| ) | |
| parser.add_argument( | |
| "-rms", | |
| "--rms-mix-rate", | |
| type=float, | |
| default=0.25, | |
| help=( | |
| "A decimal number e.g. 0.25. Control how much to use the loudness of the" | |
| " input vocals (0) or a fixed loudness (1)." | |
| ), | |
| ) | |
| parser.add_argument( | |
| "-pro", | |
| "--protect", | |
| type=float, | |
| default=0.33, | |
| help=( | |
| "A decimal number e.g. 0.33. Protect voiceless consonants and breath sounds" | |
| " to prevent artifacts such as tearing in electronic music. Set to 0.5 to" | |
| " disable. Decrease the value to increase protection, but it may reduce" | |
| " indexing accuracy." | |
| ), | |
| ) | |
| parser.add_argument( | |
| "-palgo", | |
| "--pitch-detection-algo", | |
| type=str, | |
| default="rmvpe", | |
| help=( | |
| "Best option is rmvpe (clarity in vocals), then mangio-crepe (smoother" | |
| " vocals)." | |
| ), | |
| ) | |
| parser.add_argument( | |
| "-hop", | |
| "--crepe-hop-length", | |
| type=int, | |
| default=128, | |
| help=( | |
| "If pitch detection algo is mangio-crepe, controls how often it checks for" | |
| " pitch changes in milliseconds. The higher the value, the faster the" | |
| " conversion and less risk of voice cracks, but there is less pitch" | |
| " accuracy. Recommended: 128." | |
| ), | |
| ) | |
| parser.add_argument( | |
| "-rsize", | |
| "--reverb-size", | |
| type=float, | |
| default=0.15, | |
| help="Reverb room size between 0 and 1", | |
| ) | |
| parser.add_argument( | |
| "-rwet", | |
| "--reverb-wetness", | |
| type=float, | |
| default=0.2, | |
| help="Reverb wet level between 0 and 1", | |
| ) | |
| parser.add_argument( | |
| "-rdry", | |
| "--reverb-dryness", | |
| type=float, | |
| default=0.8, | |
| help="Reverb dry level between 0 and 1", | |
| ) | |
| parser.add_argument( | |
| "-rdamp", | |
| "--reverb-damping", | |
| type=float, | |
| default=0.7, | |
| help="Reverb damping between 0 and 1", | |
| ) | |
| parser.add_argument( | |
| "-mv", | |
| "--main-vol", | |
| type=int, | |
| default=0, | |
| help=( | |
| "Volume change for converted main vocals. Measured in dB. Use -3 to" | |
| " decrease by 3 dB and 3 to increase by 3 dB" | |
| ), | |
| ) | |
| parser.add_argument( | |
| "-bv", | |
| "--backup-vol", | |
| type=int, | |
| default=0, | |
| help="Volume change for backup vocals. Measured in dB", | |
| ) | |
| parser.add_argument( | |
| "-iv", | |
| "--inst-vol", | |
| type=int, | |
| default=0, | |
| help="Volume change for instrumentals. Measured in dB", | |
| ) | |
| parser.add_argument( | |
| "-osr", | |
| "--output-sr", | |
| type=int, | |
| default=44100, | |
| help="Sample rate of output audio file.", | |
| ) | |
| parser.add_argument( | |
| "-oformat", | |
| "--output-format", | |
| type=str, | |
| default="mp3", | |
| help="format of output audio file", | |
| ) | |
| parser.add_argument( | |
| "-k", | |
| "--keep-files", | |
| action=argparse.BooleanOptionalAction, | |
| default=True, | |
| help=( | |
| "Whether to keep song directory with intermediate audio files generated" | |
| " during song cover generation." | |
| ), | |
| ) | |
| args = parser.parse_args() | |
| rvc_dirname = args.rvc_dirname | |
| song_cover_path = run_pipeline( | |
| song_input=args.song_input, | |
| voice_model=rvc_dirname, | |
| pitch_change_vocals=args.pitch_change_vocals, | |
| pitch_change_all=args.pitch_change_all, | |
| index_rate=args.index_rate, | |
| filter_radius=args.filter_radius, | |
| rms_mix_rate=args.rms_mix_rate, | |
| protect=args.protect, | |
| f0_method=args.pitch_detection_algo, | |
| crepe_hop_length=args.crepe_hop_length, | |
| reverb_rm_size=args.reverb_size, | |
| reverb_wet=args.reverb_wetness, | |
| reverb_dry=args.reverb_dryness, | |
| reverb_damping=args.reverb_damping, | |
| main_gain=args.main_vol, | |
| backup_gain=args.backup_vol, | |
| inst_gain=args.inst_vol, | |
| output_sr=args.output_sr, | |
| output_format=args.output_format, | |
| return_files=False, | |
| progress_bar=None, | |
| ) | |
| print(f"[+] Cover generated at {song_cover_path}") | |