| | """ |
| | AICoverGen CPU Performance Optimizer |
| | Place this file in the AICoverGen root directory and run it instead of main.py |
| | |
| | Usage: |
| | python optimize_cpu.py -i "song_link_or_path" -dir "model_folder_name" -p 0 |
| | |
| | This script automatically applies all CPU optimizations including: |
| | - PyTorch threading optimization |
| | - Faster processing parameters |
| | - Intel MKL optimizations (if available) |
| | """ |
| |
|
| | import os |
| | import sys |
| | import argparse |
| | import subprocess |
| | import multiprocessing |
| |
|
| | |
| | def setup_cpu_optimizations(): |
| | """Apply CPU-specific optimizations before running""" |
| | |
| | |
| | cpu_count = multiprocessing.cpu_count() |
| | |
| | |
| | |
| | os.environ['OMP_NUM_THREADS'] = str(cpu_count) |
| | os.environ['MKL_NUM_THREADS'] = str(cpu_count) |
| | os.environ['OPENBLAS_NUM_THREADS'] = str(cpu_count) |
| | os.environ['VECLIB_MAXIMUM_THREADS'] = str(cpu_count) |
| | os.environ['NUMEXPR_NUM_THREADS'] = str(cpu_count) |
| | |
| | |
| | try: |
| | import intel_extension_for_pytorch as ipex |
| | print("✓ Intel Extension for PyTorch detected - extra optimizations enabled!") |
| | except ImportError: |
| | print("ℹ Intel Extension not installed (optional). Install with: pip install intel-extension-for-pytorch") |
| | |
| | print(f"✓ CPU optimizations applied (using {cpu_count} threads)") |
| |
|
| | |
| | def get_optimized_args(): |
| | """Parse arguments with CPU-optimized defaults""" |
| | |
| | parser = argparse.ArgumentParser( |
| | description='AICoverGen with CPU optimizations', |
| | formatter_class=argparse.RawDescriptionHelpFormatter |
| | ) |
| | |
| | |
| | parser.add_argument('-i', '--song-input', type=str, required=True, |
| | help='YouTube link or local audio file path') |
| | parser.add_argument('-dir', '--rvc-dirname', type=str, required=True, |
| | help='Name of folder in rvc_models directory') |
| | parser.add_argument('-p', '--pitch-change', type=int, required=True, |
| | help='Pitch change in octaves: 1(male->female), -1(female->male), 0(no change)') |
| | |
| | |
| | parser.add_argument('-k', '--keep-files', action='store_true', |
| | help='Keep intermediate files (default: False for speed)') |
| | parser.add_argument('-ir', '--index-rate', type=float, default=0.3, |
| | help='Index rate (default: 0.3, lower=faster)') |
| | parser.add_argument('-fr', '--filter-radius', type=int, default=0, |
| | help='Median filtering (default: 0 for speed, normally 3)') |
| | parser.add_argument('-rms', '--rms-mix-rate', type=float, default=0.25, |
| | help='RMS mix rate (default: 0.25)') |
| | parser.add_argument('-palgo', '--pitch-detection-algo', type=str, default='rmvpe', |
| | choices=['rmvpe', 'mangio-crepe'], |
| | help='Pitch detection (default: rmvpe - fastest)') |
| | parser.add_argument('-hop', '--crepe-hop-length', type=int, default=128, |
| | help='Crepe hop length (default: 128, higher=faster)') |
| | parser.add_argument('-pro', '--protect', type=float, default=0.15, |
| | help='Protect consonants (default: 0.15, lower=faster)') |
| | parser.add_argument('-mv', '--main-vol', type=int, default=0, |
| | help='Main vocals volume change in dB (default: 0)') |
| | parser.add_argument('-bv', '--backup-vol', type=int, default=0, |
| | help='Backup vocals volume change in dB (default: 0)') |
| | parser.add_argument('-iv', '--inst-vol', type=int, default=0, |
| | help='Instrumental volume change in dB (default: 0)') |
| | parser.add_argument('-pall', '--pitch-change-all', type=int, default=0, |
| | help='Pitch change for all audio in semitones (default: 0)') |
| | parser.add_argument('-rsize', '--reverb-size', type=float, default=0.0, |
| | help='Reverb room size (default: 0.0 for speed)') |
| | parser.add_argument('-rwet', '--reverb-wetness', type=float, default=0.0, |
| | help='Reverb wetness (default: 0.0 for speed)') |
| | parser.add_argument('-rdry', '--reverb-dryness', type=float, default=0.8, |
| | help='Reverb dryness (default: 0.8)') |
| | parser.add_argument('-rdamp', '--reverb-damping', type=float, default=0.7, |
| | help='Reverb damping (default: 0.7)') |
| | parser.add_argument('-oformat', '--output-format', type=str, default='mp3', |
| | choices=['mp3', 'wav'], |
| | help='Output format (default: mp3 for smaller size)') |
| | |
| | return parser.parse_args() |
| |
|
| | |
| | def main(): |
| | print("=" * 60) |
| | print("AICoverGen CPU Performance Optimizer") |
| | print("=" * 60) |
| | |
| | |
| | setup_cpu_optimizations() |
| | |
| | |
| | args = get_optimized_args() |
| | |
| | |
| | cmd = [ |
| | sys.executable, |
| | 'src/main.py', |
| | '-i', args.song_input, |
| | '-dir', args.rvc_dirname, |
| | '-p', str(args.pitch_change), |
| | '-ir', str(args.index_rate), |
| | '-fr', str(args.filter_radius), |
| | '-rms', str(args.rms_mix_rate), |
| | '-palgo', args.pitch_detection_algo, |
| | '-hop', str(args.crepe_hop_length), |
| | '-pro', str(args.protect), |
| | '-mv', str(args.main_vol), |
| | '-bv', str(args.backup_vol), |
| | '-iv', str(args.inst_vol), |
| | '-pall', str(args.pitch_change_all), |
| | '-rsize', str(args.reverb_size), |
| | '-rwet', str(args.reverb_wetness), |
| | '-rdry', str(args.reverb_dryness), |
| | '-rdamp', str(args.reverb_damping), |
| | '-oformat', args.output_format |
| | ] |
| | |
| | if args.keep_files: |
| | cmd.append('-k') |
| | |
| | print("\n📊 Optimized Settings Applied:") |
| | print(f" • Threading: {os.environ['OMP_NUM_THREADS']} threads") |
| | print(f" • Pitch Detection: {args.pitch_detection_algo} (fastest)") |
| | print(f" • Filter Radius: {args.filter_radius} (0=fastest)") |
| | print(f" • Protect: {args.protect} (lower=faster)") |
| | print(f" • Reverb: Disabled for speed") |
| | print(f" • Output Format: {args.output_format}") |
| | |
| | print("\n🚀 Starting optimized processing...") |
| | print("=" * 60) |
| | |
| | |
| | try: |
| | subprocess.run(cmd, check=True) |
| | print("\n" + "=" * 60) |
| | print("✅ Processing complete!") |
| | print("=" * 60) |
| | except subprocess.CalledProcessError as e: |
| | print(f"\n❌ Error during processing: {e}") |
| | sys.exit(1) |
| | except KeyboardInterrupt: |
| | print("\n\n⚠️ Processing interrupted by user") |
| | sys.exit(0) |
| |
|
| | if __name__ == '__main__': |
| | main() |