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}")