Spaces:
				
			
			
	
			
			
		Sleeping
		
	
	
	
			
			
	
	
	
	
		
		
		Sleeping
		
	Demo uploaded with RVC options and more languages
Browse files- app.py +472 -87
- configs/32k.json +46 -0
- configs/32k_v2.json +46 -0
- configs/40k.json +46 -0
- configs/48k.json +46 -0
- configs/48k_v2.json +46 -0
- lib/audio.py +21 -0
- lib/infer_pack/attentions.py +417 -0
- lib/infer_pack/commons.py +166 -0
- lib/infer_pack/models.py +1142 -0
- lib/infer_pack/models_dml.py +1124 -0
- lib/infer_pack/models_onnx.py +819 -0
- lib/infer_pack/modules.py +522 -0
- lib/infer_pack/modules/F0Predictor/DioF0Predictor.py +90 -0
- lib/infer_pack/modules/F0Predictor/F0Predictor.py +16 -0
- lib/infer_pack/modules/F0Predictor/HarvestF0Predictor.py +86 -0
- lib/infer_pack/modules/F0Predictor/PMF0Predictor.py +97 -0
- lib/infer_pack/modules/F0Predictor/__init__.py +0 -0
- lib/infer_pack/onnx_inference.py +145 -0
- lib/infer_pack/transforms.py +209 -0
- lib/rmvpe.py +432 -0
- requirements_colab.txt +9 -0
- requirements_extra.txt +8 -0
- soni_translate/audio_segments.py +1 -1
- soni_translate/text_to_speech.py +2 -2
- soni_translate/translate_segments.py +0 -3
- vc_infer_pipeline.py +445 -0
- voice_main.py +554 -0
    	
        app.py
    CHANGED
    
    | @@ -1,7 +1,21 @@ | |
| 1 | 
             
            #%cd SoniTranslate
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 2 | 
             
            import numpy as np
         | 
| 3 | 
             
            import gradio as gr
         | 
| 4 | 
             
            import whisperx
         | 
|  | |
|  | |
|  | |
| 5 | 
             
            import torch
         | 
| 6 | 
             
            from gtts import gTTS
         | 
| 7 | 
             
            import librosa
         | 
| @@ -15,14 +29,29 @@ import os | |
| 15 | 
             
            from soni_translate.audio_segments import create_translated_audio
         | 
| 16 | 
             
            from soni_translate.text_to_speech import make_voice_gradio
         | 
| 17 | 
             
            from soni_translate.translate_segments import translate_text
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 18 |  | 
| 19 | 
             
            title = "<center><strong><font size='7'>📽️ SoniTranslate 🈷️</font></strong></center>"
         | 
| 20 |  | 
| 21 | 
             
            news = """ ## 📖 News
         | 
| 22 | 
            -
                    🔥 2023/07/26:  | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 23 | 
             
                    """
         | 
| 24 |  | 
| 25 | 
            -
            description = """ | 
| 26 | 
             
            ### 🎥 **Translate videos easily with SoniTranslate!** 📽️
         | 
| 27 |  | 
| 28 | 
             
            Upload a video or provide a video link. Limitation: 10 seconds for CPU, but no restrictions with a GPU.
         | 
| @@ -32,13 +61,14 @@ For faster results and no duration limits, try the Colab notebook with a GPU: | |
| 32 |  | 
| 33 | 
             
            📽️ **This a demo of SoniTranslate; GitHub repository: [SoniTranslate](https://github.com/R3gm/SoniTranslate)!**
         | 
| 34 |  | 
| 35 | 
            -
            See the tab labeled  | 
| 36 | 
             
            """
         | 
| 37 |  | 
| 38 |  | 
| 39 |  | 
| 40 | 
            -
            tutorial = """ | 
| 41 | 
            -
             | 
|  | |
| 42 |  | 
| 43 | 
             
            1. 📤 **Upload a video** on the first tab or 🌐 **use a video link** on the second tab.
         | 
| 44 |  | 
| @@ -47,6 +77,24 @@ tutorial = """ | |
| 47 | 
             
            3. 🗣️ Specify the **number of people speaking** in the video and **assign each one a text-to-speech voice** suitable for the translation language.
         | 
| 48 |  | 
| 49 | 
             
            4. 🚀 Press the '**Translate**' button to obtain the results.
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 50 | 
             
            """
         | 
| 51 |  | 
| 52 |  | 
| @@ -56,16 +104,171 @@ if torch.cuda.is_available(): | |
| 56 | 
             
                device = "cuda"
         | 
| 57 | 
             
                list_compute_type = ['float16', 'float32']
         | 
| 58 | 
             
                compute_type_default = 'float16'
         | 
| 59 | 
            -
                whisper_model_default = 'large- | 
| 60 | 
             
            else:
         | 
| 61 | 
             
                device = "cpu"
         | 
| 62 | 
             
                list_compute_type = ['float32']
         | 
| 63 | 
             
                compute_type_default = 'float32'
         | 
| 64 | 
            -
                whisper_model_default = ' | 
| 65 | 
             
            print('Working in: ', device)
         | 
| 66 |  | 
| 67 | 
             
            list_tts = ['af-ZA-AdriNeural-Female', 'af-ZA-WillemNeural-Male', 'am-ET-AmehaNeural-Male', 'am-ET-MekdesNeural-Female', 'ar-AE-FatimaNeural-Female', 'ar-AE-HamdanNeural-Male', 'ar-BH-AliNeural-Male', 'ar-BH-LailaNeural-Female', 'ar-DZ-AminaNeural-Female', 'ar-DZ-IsmaelNeural-Male', 'ar-EG-SalmaNeural-Female', 'ar-EG-ShakirNeural-Male', 'ar-IQ-BasselNeural-Male', 'ar-IQ-RanaNeural-Female', 'ar-JO-SanaNeural-Female', 'ar-JO-TaimNeural-Male', 'ar-KW-FahedNeural-Male', 'ar-KW-NouraNeural-Female', 'ar-LB-LaylaNeural-Female', 'ar-LB-RamiNeural-Male', 'ar-LY-ImanNeural-Female', 'ar-LY-OmarNeural-Male', 'ar-MA-JamalNeural-Male', 'ar-MA-MounaNeural-Female', 'ar-OM-AbdullahNeural-Male', 'ar-OM-AyshaNeural-Female', 'ar-QA-AmalNeural-Female', 'ar-QA-MoazNeural-Male', 'ar-SA-HamedNeural-Male', 'ar-SA-ZariyahNeural-Female', 'ar-SY-AmanyNeural-Female', 'ar-SY-LaithNeural-Male', 'ar-TN-HediNeural-Male', 'ar-TN-ReemNeural-Female', 'ar-YE-MaryamNeural-Female', 'ar-YE-SalehNeural-Male', 'az-AZ-BabekNeural-Male', 'az-AZ-BanuNeural-Female', 'bg-BG-BorislavNeural-Male', 'bg-BG-KalinaNeural-Female', 'bn-BD-NabanitaNeural-Female', 'bn-BD-PradeepNeural-Male', 'bn-IN-BashkarNeural-Male', 'bn-IN-TanishaaNeural-Female', 'bs-BA-GoranNeural-Male', 'bs-BA-VesnaNeural-Female', 'ca-ES-EnricNeural-Male', 'ca-ES-JoanaNeural-Female', 'cs-CZ-AntoninNeural-Male', 'cs-CZ-VlastaNeural-Female', 'cy-GB-AledNeural-Male', 'cy-GB-NiaNeural-Female', 'da-DK-ChristelNeural-Female', 'da-DK-JeppeNeural-Male', 'de-AT-IngridNeural-Female', 'de-AT-JonasNeural-Male', 'de-CH-JanNeural-Male', 'de-CH-LeniNeural-Female', 'de-DE-AmalaNeural-Female', 'de-DE-ConradNeural-Male', 'de-DE-KatjaNeural-Female', 'de-DE-KillianNeural-Male', 'el-GR-AthinaNeural-Female', 'el-GR-NestorasNeural-Male', 'en-AU-NatashaNeural-Female', 'en-AU-WilliamNeural-Male', 'en-CA-ClaraNeural-Female', 'en-CA-LiamNeural-Male', 'en-GB-LibbyNeural-Female', 'en-GB-MaisieNeural-Female', 'en-GB-RyanNeural-Male', 'en-GB-SoniaNeural-Female', 'en-GB-ThomasNeural-Male', 'en-HK-SamNeural-Male', 'en-HK-YanNeural-Female', 'en-IE-ConnorNeural-Male', 'en-IE-EmilyNeural-Female', 'en-IN-NeerjaExpressiveNeural-Female', 'en-IN-NeerjaNeural-Female', 'en-IN-PrabhatNeural-Male', 'en-KE-AsiliaNeural-Female', 'en-KE-ChilembaNeural-Male', 'en-NG-AbeoNeural-Male', 'en-NG-EzinneNeural-Female', 'en-NZ-MitchellNeural-Male', 'en-NZ-MollyNeural-Female', 'en-PH-JamesNeural-Male', 'en-PH-RosaNeural-Female', 'en-SG-LunaNeural-Female', 'en-SG-WayneNeural-Male', 'en-TZ-ElimuNeural-Male', 'en-TZ-ImaniNeural-Female', 'en-US-AnaNeural-Female', 'en-US-AriaNeural-Female', 'en-US-ChristopherNeural-Male', 'en-US-EricNeural-Male', 'en-US-GuyNeural-Male', 'en-US-JennyNeural-Female', 'en-US-MichelleNeural-Female', 'en-US-RogerNeural-Male', 'en-US-SteffanNeural-Male', 'en-ZA-LeahNeural-Female', 'en-ZA-LukeNeural-Male', 'es-AR-ElenaNeural-Female', 'es-AR-TomasNeural-Male', 'es-BO-MarceloNeural-Male', 'es-BO-SofiaNeural-Female', 'es-CL-CatalinaNeural-Female', 'es-CL-LorenzoNeural-Male', 'es-CO-GonzaloNeural-Male', 'es-CO-SalomeNeural-Female', 'es-CR-JuanNeural-Male', 'es-CR-MariaNeural-Female', 'es-CU-BelkysNeural-Female', 'es-CU-ManuelNeural-Male', 'es-DO-EmilioNeural-Male', 'es-DO-RamonaNeural-Female', 'es-EC-AndreaNeural-Female', 'es-EC-LuisNeural-Male', 'es-ES-AlvaroNeural-Male', 'es-ES-ElviraNeural-Female', 'es-GQ-JavierNeural-Male', 'es-GQ-TeresaNeural-Female', 'es-GT-AndresNeural-Male', 'es-GT-MartaNeural-Female', 'es-HN-CarlosNeural-Male', 'es-HN-KarlaNeural-Female', 'es-MX-DaliaNeural-Female', 'es-MX-JorgeNeural-Male', 'es-NI-FedericoNeural-Male', 'es-NI-YolandaNeural-Female', 'es-PA-MargaritaNeural-Female', 'es-PA-RobertoNeural-Male', 'es-PE-AlexNeural-Male', 'es-PE-CamilaNeural-Female', 'es-PR-KarinaNeural-Female', 'es-PR-VictorNeural-Male', 'es-PY-MarioNeural-Male', 'es-PY-TaniaNeural-Female', 'es-SV-LorenaNeural-Female', 'es-SV-RodrigoNeural-Male', 'es-US-AlonsoNeural-Male', 'es-US-PalomaNeural-Female', 'es-UY-MateoNeural-Male', 'es-UY-ValentinaNeural-Female', 'es-VE-PaolaNeural-Female', 'es-VE-SebastianNeural-Male', 'et-EE-AnuNeural-Female', 'et-EE-KertNeural-Male', 'fa-IR-DilaraNeural-Female', 'fa-IR-FaridNeural-Male', 'fi-FI-HarriNeural-Male', 'fi-FI-NooraNeural-Female', 'fil-PH-AngeloNeural-Male', 'fil-PH-BlessicaNeural-Female', 'fr-BE-CharlineNeural-Female', 'fr-BE-GerardNeural-Male', 'fr-CA-AntoineNeural-Male', 'fr-CA-JeanNeural-Male', 'fr-CA-SylvieNeural-Female', 'fr-CH-ArianeNeural-Female', 'fr-CH-FabriceNeural-Male', 'fr-FR-DeniseNeural-Female', 'fr-FR-EloiseNeural-Female', 'fr-FR-HenriNeural-Male', 'ga-IE-ColmNeural-Male', 'ga-IE-OrlaNeural-Female', 'gl-ES-RoiNeural-Male', 'gl-ES-SabelaNeural-Female', 'gu-IN-DhwaniNeural-Female', 'gu-IN-NiranjanNeural-Male', 'he-IL-AvriNeural-Male', 'he-IL-HilaNeural-Female', 'hi-IN-MadhurNeural-Male', 'hi-IN-SwaraNeural-Female', 'hr-HR-GabrijelaNeural-Female', 'hr-HR-SreckoNeural-Male', 'hu-HU-NoemiNeural-Female', 'hu-HU-TamasNeural-Male', 'id-ID-ArdiNeural-Male', 'id-ID-GadisNeural-Female', 'is-IS-GudrunNeural-Female', 'is-IS-GunnarNeural-Male', 'it-IT-DiegoNeural-Male', 'it-IT-ElsaNeural-Female', 'it-IT-IsabellaNeural-Female', 'ja-JP-KeitaNeural-Male', 'ja-JP-NanamiNeural-Female', 'jv-ID-DimasNeural-Male', 'jv-ID-SitiNeural-Female', 'ka-GE-EkaNeural-Female', 'ka-GE-GiorgiNeural-Male', 'kk-KZ-AigulNeural-Female', 'kk-KZ-DauletNeural-Male', 'km-KH-PisethNeural-Male', 'km-KH-SreymomNeural-Female', 'kn-IN-GaganNeural-Male', 'kn-IN-SapnaNeural-Female', 'ko-KR-InJoonNeural-Male', 'ko-KR-SunHiNeural-Female', 'lo-LA-ChanthavongNeural-Male', 'lo-LA-KeomanyNeural-Female', 'lt-LT-LeonasNeural-Male', 'lt-LT-OnaNeural-Female', 'lv-LV-EveritaNeural-Female', 'lv-LV-NilsNeural-Male', 'mk-MK-AleksandarNeural-Male', 'mk-MK-MarijaNeural-Female', 'ml-IN-MidhunNeural-Male', 'ml-IN-SobhanaNeural-Female', 'mn-MN-BataaNeural-Male', 'mn-MN-YesuiNeural-Female', 'mr-IN-AarohiNeural-Female', 'mr-IN-ManoharNeural-Male', 'ms-MY-OsmanNeural-Male', 'ms-MY-YasminNeural-Female', 'mt-MT-GraceNeural-Female', 'mt-MT-JosephNeural-Male', 'my-MM-NilarNeural-Female', 'my-MM-ThihaNeural-Male', 'nb-NO-FinnNeural-Male', 'nb-NO-PernilleNeural-Female', 'ne-NP-HemkalaNeural-Female', 'ne-NP-SagarNeural-Male', 'nl-BE-ArnaudNeural-Male', 'nl-BE-DenaNeural-Female', 'nl-NL-ColetteNeural-Female', 'nl-NL-FennaNeural-Female', 'nl-NL-MaartenNeural-Male', 'pl-PL-MarekNeural-Male', 'pl-PL-ZofiaNeural-Female', 'ps-AF-GulNawazNeural-Male', 'ps-AF-LatifaNeural-Female', 'pt-BR-AntonioNeural-Male', 'pt-BR-FranciscaNeural-Female', 'pt-PT-DuarteNeural-Male', 'pt-PT-RaquelNeural-Female', 'ro-RO-AlinaNeural-Female', 'ro-RO-EmilNeural-Male', 'ru-RU-DmitryNeural-Male', 'ru-RU-SvetlanaNeural-Female', 'si-LK-SameeraNeural-Male', 'si-LK-ThiliniNeural-Female', 'sk-SK-LukasNeural-Male', 'sk-SK-ViktoriaNeural-Female', 'sl-SI-PetraNeural-Female', 'sl-SI-RokNeural-Male', 'so-SO-MuuseNeural-Male', 'so-SO-UbaxNeural-Female', 'sq-AL-AnilaNeural-Female', 'sq-AL-IlirNeural-Male', 'sr-RS-NicholasNeural-Male', 'sr-RS-SophieNeural-Female', 'su-ID-JajangNeural-Male', 'su-ID-TutiNeural-Female', 'sv-SE-MattiasNeural-Male', 'sv-SE-SofieNeural-Female', 'sw-KE-RafikiNeural-Male', 'sw-KE-ZuriNeural-Female', 'sw-TZ-DaudiNeural-Male', 'sw-TZ-RehemaNeural-Female', 'ta-IN-PallaviNeural-Female', 'ta-IN-ValluvarNeural-Male', 'ta-LK-KumarNeural-Male', 'ta-LK-SaranyaNeural-Female', 'ta-MY-KaniNeural-Female', 'ta-MY-SuryaNeural-Male', 'ta-SG-AnbuNeural-Male', 'ta-SG-VenbaNeural-Female', 'te-IN-MohanNeural-Male', 'te-IN-ShrutiNeural-Female', 'th-TH-NiwatNeural-Male', 'th-TH-PremwadeeNeural-Female', 'tr-TR-AhmetNeural-Male', 'tr-TR-EmelNeural-Female', 'uk-UA-OstapNeural-Male', 'uk-UA-PolinaNeural-Female', 'ur-IN-GulNeural-Female', 'ur-IN-SalmanNeural-Male', 'ur-PK-AsadNeural-Male', 'ur-PK-UzmaNeural-Female', 'uz-UZ-MadinaNeural-Female', 'uz-UZ-SardorNeural-Male', 'vi-VN-HoaiMyNeural-Female', 'vi-VN-NamMinhNeural-Male', 'zh-CN-XiaoxiaoNeural-Female', 'zh-CN-XiaoyiNeural-Female', 'zh-CN-YunjianNeural-Male', 'zh-CN-YunxiNeural-Male', 'zh-CN-YunxiaNeural-Male', 'zh-CN-YunyangNeural-Male', 'zh-CN-liaoning-XiaobeiNeural-Female', 'zh-CN-shaanxi-XiaoniNeural-Female']
         | 
| 68 |  | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 69 | 
             
            '''
         | 
| 70 | 
             
            def translate_from_video(video, WHISPER_MODEL_SIZE, batch_size, compute_type,
         | 
| 71 | 
             
                                     TRANSLATE_AUDIO_TO, min_speakers, max_speakers,
         | 
| @@ -106,32 +309,55 @@ def translate_from_video( | |
| 106 | 
             
                tts_voice05="en-GB-MaisieNeural-Female",
         | 
| 107 | 
             
                video_output="video_dub.mp4",
         | 
| 108 | 
             
                AUDIO_MIX_METHOD='Adjusting volumes and mixing audio',
         | 
|  | |
| 109 | 
             
                ):
         | 
| 110 |  | 
| 111 | 
             
                if YOUR_HF_TOKEN == "" or YOUR_HF_TOKEN == None:
         | 
| 112 | 
             
                  YOUR_HF_TOKEN = os.getenv("YOUR_HF_TOKEN")
         | 
| 113 | 
             
                  if YOUR_HF_TOKEN == None:
         | 
| 114 | 
             
                    print('No valid token')
         | 
| 115 | 
            -
                    return 
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
| 116 |  | 
| 117 | 
             
                if "SET_LIMIT" == os.getenv("DEMO"):
         | 
| 118 | 
             
                  preview=True
         | 
| 119 | 
             
                  print("DEMO; set preview=True; The generation is **limited to 10 seconds** to prevent errors with the CPU. If you use a GPU, you won't have any of these limitations.")
         | 
| 120 | 
             
                  AUDIO_MIX_METHOD='Adjusting volumes and mixing audio'
         | 
| 121 | 
             
                  print("DEMO; set Adjusting volumes and mixing audio")
         | 
|  | |
|  | |
| 122 |  | 
| 123 | 
             
                LANGUAGES = {
         | 
| 124 | 
             
                    'Automatic detection': 'Automatic detection',
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
| 125 | 
             
                    'English (en)': 'en',
         | 
|  | |
| 126 | 
             
                    'French (fr)': 'fr',
         | 
| 127 | 
             
                    'German (de)': 'de',
         | 
| 128 | 
            -
                    ' | 
|  | |
|  | |
| 129 | 
             
                    'Italian (it)': 'it',
         | 
| 130 | 
             
                    'Japanese (ja)': 'ja',
         | 
| 131 | 
            -
                    ' | 
| 132 | 
            -
                    ' | 
|  | |
|  | |
|  | |
|  | |
|  | |
| 133 | 
             
                    'Ukrainian (uk)': 'uk',
         | 
| 134 | 
            -
                    ' | 
|  | |
|  | |
| 135 | 
             
                }
         | 
| 136 |  | 
| 137 | 
             
                TRANSLATE_AUDIO_TO = LANGUAGES[TRANSLATE_AUDIO_TO]
         | 
| @@ -157,14 +383,41 @@ def translate_from_video( | |
| 157 | 
             
                os.system("rm audio.webm")
         | 
| 158 | 
             
                os.system("rm audio.wav")
         | 
| 159 |  | 
|  | |
| 160 | 
             
                if os.path.exists(video):
         | 
| 161 | 
             
                    if preview:
         | 
| 162 | 
             
                        print('Creating a preview video of 10 seconds, to disable this option, go to advanced settings and turn off preview.')
         | 
| 163 | 
             
                        os.system(f'ffmpeg -y -i "{video}" -ss 00:00:20 -t 00:00:10 -c:v libx264 -c:a aac -strict experimental Video.mp4')
         | 
| 164 | 
             
                    else:
         | 
| 165 | 
            -
                         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 166 |  | 
| 167 | 
            -
                    os.system("ffmpeg -y -i Video.mp4 -vn -acodec pcm_s16le -ar 44100 -ac 2 audio.wav")
         | 
| 168 | 
             
                else:
         | 
| 169 | 
             
                    if preview:
         | 
| 170 | 
             
                        print('Creating a preview from the link, 10 seconds to disable this option, go to advanced settings and turn off preview.')
         | 
| @@ -191,25 +444,43 @@ def translate_from_video( | |
| 191 | 
             
                              return
         | 
| 192 |  | 
| 193 | 
             
                print("Set file complete.")
         | 
|  | |
| 194 |  | 
| 195 | 
             
                SOURCE_LANGUAGE = None if SOURCE_LANGUAGE == 'Automatic detection' else SOURCE_LANGUAGE
         | 
| 196 |  | 
| 197 | 
             
                # 1. Transcribe with original whisper (batched)
         | 
| 198 | 
            -
                 | 
| 199 | 
            -
             | 
| 200 | 
            -
             | 
| 201 | 
            -
             | 
| 202 | 
            -
             | 
| 203 | 
            -
             | 
|  | |
|  | |
| 204 | 
             
                audio = whisperx.load_audio(audio_wav)
         | 
| 205 | 
             
                result = model.transcribe(audio, batch_size=batch_size)
         | 
| 206 | 
             
                gc.collect(); torch.cuda.empty_cache(); del model
         | 
| 207 | 
             
                print("Transcript complete")
         | 
| 208 |  | 
|  | |
|  | |
| 209 | 
             
                # 2. Align whisper output
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 210 | 
             
                model_a, metadata = whisperx.load_align_model(
         | 
| 211 | 
             
                    language_code=result["language"],
         | 
| 212 | 
            -
                    device=device
         | 
|  | |
| 213 | 
             
                    )
         | 
| 214 | 
             
                result = whisperx.align(
         | 
| 215 | 
             
                    result["segments"],
         | 
| @@ -223,11 +494,14 @@ def translate_from_video( | |
| 223 | 
             
                print("Align complete")
         | 
| 224 |  | 
| 225 | 
             
                if result['segments'] == []:
         | 
| 226 | 
            -
             | 
| 227 | 
            -
             | 
| 228 |  | 
| 229 | 
             
                # 3. Assign speaker labels
         | 
| 230 | 
            -
                 | 
|  | |
|  | |
|  | |
| 231 | 
             
                diarize_segments = diarize_model(
         | 
| 232 | 
             
                    audio_wav,
         | 
| 233 | 
             
                    min_speakers=min_speakers,
         | 
| @@ -236,10 +510,17 @@ def translate_from_video( | |
| 236 | 
             
                gc.collect(); torch.cuda.empty_cache(); del diarize_model
         | 
| 237 | 
             
                print("Diarize complete")
         | 
| 238 |  | 
|  | |
|  | |
|  | |
|  | |
|  | |
| 239 | 
             
                result_diarize['segments'] = translate_text(result_diarize['segments'], TRANSLATE_AUDIO_TO)
         | 
| 240 | 
             
                print("Translation complete")
         | 
| 241 |  | 
|  | |
| 242 | 
             
                audio_files = []
         | 
|  | |
| 243 |  | 
| 244 | 
             
                # Mapping speakers to voice variables
         | 
| 245 | 
             
                speaker_to_voice = {
         | 
| @@ -262,7 +543,7 @@ def translate_from_video( | |
| 262 | 
             
                    except KeyError:
         | 
| 263 | 
             
                        segment['speaker'] = "SPEAKER_99"
         | 
| 264 | 
             
                        speaker = segment['speaker']
         | 
| 265 | 
            -
                        print("NO SPEAKER DETECT IN SEGMENT")
         | 
| 266 |  | 
| 267 | 
             
                    # make the tts audio
         | 
| 268 | 
             
                    filename = f"audio/{start}.ogg"
         | 
| @@ -301,11 +582,20 @@ def translate_from_video( | |
| 301 |  | 
| 302 | 
             
                    duration_create = librosa.get_duration(filename=f"audio2/{filename}")
         | 
| 303 | 
             
                    audio_files.append(filename)
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 304 |  | 
| 305 | 
             
                # replace files with the accelerates
         | 
| 306 | 
             
                os.system("mv -f audio2/audio/*.ogg audio/")
         | 
| 307 |  | 
| 308 | 
             
                os.system(f"rm {Output_name_file}")
         | 
|  | |
|  | |
|  | |
| 309 | 
             
                create_translated_audio(result_diarize, audio_files, Output_name_file)
         | 
| 310 |  | 
| 311 | 
             
                os.system(f"rm {mix_audio}")
         | 
| @@ -320,7 +610,7 @@ def translate_from_video( | |
| 320 | 
             
                        os.system(f'ffmpeg -i {audio_wav} -i {Output_name_file} -filter_complex "[1:a]asplit=2[sc][mix];[0:a][sc]sidechaincompress=threshold=0.003:ratio=20[bg]; [bg][mix]amerge[final]" -map [final] {mix_audio}')
         | 
| 321 | 
             
                    except:
         | 
| 322 | 
             
                        # volume mix except
         | 
| 323 | 
            -
                        os.system(f'ffmpeg -y -i {audio_wav} -i {Output_name_file} -filter_complex "[0:0]volume=0. | 
| 324 |  | 
| 325 | 
             
                os.system(f"rm {video_output}")
         | 
| 326 | 
             
                os.system(f"ffmpeg -i {OutputFile} -i {mix_audio} -c:v copy -c:a copy -map 0:v -map 1:a -shortest {video_output}")
         | 
| @@ -352,6 +642,10 @@ def read_logs(): | |
| 352 | 
             
                with open("output.log", "r") as f:
         | 
| 353 | 
             
                    return f.read()
         | 
| 354 |  | 
|  | |
|  | |
|  | |
|  | |
| 355 | 
             
            # max tts
         | 
| 356 | 
             
            MAX_TTS = 6
         | 
| 357 |  | 
| @@ -362,12 +656,16 @@ with gr.Blocks(theme=theme) as demo: | |
| 362 | 
             
                gr.Markdown(description)
         | 
| 363 |  | 
| 364 | 
             
            #### video
         | 
| 365 | 
            -
                with gr.Tab(" | 
| 366 | 
             
                    with gr.Row():
         | 
| 367 | 
             
                        with gr.Column():
         | 
| 368 | 
            -
                            video_input = gr.Video() # height=300,width=300
         | 
| 369 | 
            -
                             | 
| 370 | 
            -
                             | 
|  | |
|  | |
|  | |
|  | |
| 371 |  | 
| 372 | 
             
                            line_ = gr.HTML("<hr></h2>")
         | 
| 373 | 
             
                            gr.Markdown("Select how many people are speaking in the video.")
         | 
| @@ -389,15 +687,15 @@ with gr.Blocks(theme=theme) as demo: | |
| 389 |  | 
| 390 | 
             
                            with gr.Column():
         | 
| 391 | 
             
                                  with gr.Accordion("Advanced Settings", open=False):
         | 
| 392 | 
            -
             | 
| 393 | 
             
                                      AUDIO_MIX = gr.Dropdown(['Mixing audio with sidechain compression', 'Adjusting volumes and mixing audio'], value='Adjusting volumes and mixing audio', label = 'Audio Mixing Method', info="Mix original and translated audio files to create a customized, balanced output with two available mixing modes.")
         | 
| 394 | 
            -
             | 
| 395 | 
             
                                      gr.HTML("<hr></h2>")
         | 
| 396 | 
             
                                      gr.Markdown("Default configuration of Whisper.")
         | 
| 397 | 
             
                                      WHISPER_MODEL_SIZE = gr.inputs.Dropdown(['tiny', 'base', 'small', 'medium', 'large-v1', 'large-v2'], default=whisper_model_default, label="Whisper model")
         | 
| 398 | 
             
                                      batch_size = gr.inputs.Slider(1, 32, default=16, label="Batch size", step=1)
         | 
| 399 | 
             
                                      compute_type = gr.inputs.Dropdown(list_compute_type, default=compute_type_default, label="Compute type")
         | 
| 400 | 
            -
             | 
| 401 | 
             
                                      gr.HTML("<hr></h2>")
         | 
| 402 | 
             
                                      VIDEO_OUTPUT_NAME = gr.Textbox(label="Translated file name" ,value="video_output.mp4", info="The name of the output file")
         | 
| 403 | 
             
                                      PREVIEW = gr.Checkbox(label="Preview", info="Preview cuts the video to only 10 seconds for testing purposes. Please deactivate it to retrieve the full video duration.")
         | 
| @@ -406,7 +704,7 @@ with gr.Blocks(theme=theme) as demo: | |
| 406 | 
             
                            with gr.Row():
         | 
| 407 | 
             
                                video_button = gr.Button("TRANSLATE", )
         | 
| 408 | 
             
                            with gr.Row():
         | 
| 409 | 
            -
                                video_output = gr.Video()
         | 
| 410 |  | 
| 411 | 
             
                            line_ = gr.HTML("<hr></h2>")
         | 
| 412 | 
             
                            if os.getenv("YOUR_HF_TOKEN") == None or os.getenv("YOUR_HF_TOKEN") == "":
         | 
| @@ -419,10 +717,10 @@ with gr.Blocks(theme=theme) as demo: | |
| 419 | 
             
                                    [
         | 
| 420 | 
             
                                        "./assets/Video_main.mp4",
         | 
| 421 | 
             
                                        "",
         | 
| 422 | 
            -
                                         | 
| 423 | 
            -
                                        " | 
| 424 | 
             
                                        16,
         | 
| 425 | 
            -
                                        " | 
| 426 | 
             
                                        "Spanish (es)",
         | 
| 427 | 
             
                                        "English (en)",
         | 
| 428 | 
             
                                        1,
         | 
| @@ -459,49 +757,19 @@ with gr.Blocks(theme=theme) as demo: | |
| 459 | 
             
                                AUDIO_MIX,
         | 
| 460 | 
             
                                ],
         | 
| 461 | 
             
                                outputs=[video_output],
         | 
| 462 | 
            -
                                cache_examples= | 
| 463 | 
             
                            )
         | 
| 464 |  | 
| 465 | 
             
            ### link
         | 
| 466 |  | 
| 467 | 
            -
                with gr.Tab(" | 
| 468 | 
             
                    with gr.Row():
         | 
| 469 | 
             
                        with gr.Column():
         | 
| 470 |  | 
| 471 | 
             
                            blink_input = gr.Textbox(label="Media link.", info="Example: www.youtube.com/watch?v=g_9rPvbENUw", placeholder="URL goes here...")
         | 
| 472 | 
            -
                            # bSOURCE_LANGUAGE = gr.Dropdown(['Automatic detection', 'en', 'fr', 'de', 'es', 'it', 'ja', 'zh', 'nl', 'uk', 'pt'], value='en',label = 'Source language')
         | 
| 473 | 
            -
             | 
| 474 | 
            -
                            # gr.HTML("<hr></h2>")
         | 
| 475 | 
            -
             | 
| 476 | 
            -
                            # bHFKEY = gr.Textbox(label="HF Token", info="One important step is to accept the license agreement for using Pyannote. You need to have an account on Hugging Face and accept the license to use the models: https://huggingface.co/pyannote/speaker-diarization and https://huggingface.co/pyannote/segmentation. Get your KEY TOKEN here: https://hf.co/settings/tokens", placeholder="Token goes here...")
         | 
| 477 | 
            -
             | 
| 478 | 
            -
                            # gr.Markdown("Select the target language, and make sure to select the language corresponding to the speakers of the target language to avoid errors in the process.")
         | 
| 479 | 
            -
                            # bTRANSLATE_AUDIO_TO = gr.inputs.Dropdown(['en', 'fr', 'de', 'es', 'it', 'ja', 'zh', 'nl', 'uk', 'pt'], default='en',label = 'Translate audio to')
         | 
| 480 | 
            -
             | 
| 481 | 
            -
                            # gr.Markdown("Select how many people are speaking in the video.")
         | 
| 482 | 
            -
                            # bmin_speakers = gr.inputs.Slider(1, 6, default=1, label="min_speakers", step=1, )
         | 
| 483 | 
            -
                            # bmax_speakers = gr.inputs.Slider(1, 6, default=2, label="max_speakers",step=1)
         | 
| 484 |  | 
| 485 | 
            -
                             | 
| 486 | 
            -
                             | 
| 487 | 
            -
                            # btts_voice01 = gr.inputs.Dropdown(list_tts, default='en-CA-ClaraNeural-Female', label = 'TTS Speaker 2')
         | 
| 488 | 
            -
                            # btts_voice02 = gr.inputs.Dropdown(list_tts, default='en-GB-ThomasNeural-Male', label = 'TTS Speaker 3')
         | 
| 489 | 
            -
                            # btts_voice03 = gr.inputs.Dropdown(list_tts, default='en-GB-SoniaNeural-Female', label = 'TTS Speaker 4')
         | 
| 490 | 
            -
                            # btts_voice04 = gr.inputs.Dropdown(list_tts, default='en-NZ-MitchellNeural-Male', label = 'TTS Speaker 5')
         | 
| 491 | 
            -
                            # btts_voice05 = gr.inputs.Dropdown(list_tts, default='en-GB-MaisieNeural-Female', label = 'TTS Speaker 6')
         | 
| 492 | 
            -
             | 
| 493 | 
            -
                            # with gr.Column():
         | 
| 494 | 
            -
                            #       with gr.Accordion("Advanced Settings", open=False):
         | 
| 495 | 
            -
                            #           gr.Markdown("Default configuration of Whisper.")
         | 
| 496 | 
            -
                            #           bWHISPER_MODEL_SIZE = gr.inputs.Dropdown(['tiny', 'base', 'small', 'medium', 'large-v1', 'large-v2'], default=whisper_model_default, label="Whisper model")
         | 
| 497 | 
            -
                            #           bbatch_size = gr.inputs.Slider(1, 32, default=16, label="Batch size", step=1)
         | 
| 498 | 
            -
                            #           bcompute_type = gr.inputs.Dropdown(list_compute_type, default=compute_type_default, label="Compute type")
         | 
| 499 | 
            -
             | 
| 500 | 
            -
                            #           bPREVIEW = gr.inputs.Checkbox(label="Preview cuts the video to only 10 seconds for testing purposes. Please deactivate it to retrieve the full video duration.")
         | 
| 501 | 
            -
                            #           bVIDEO_OUTPUT_NAME = gr.Textbox(label="Translated file name" ,value="video_output.mp4")
         | 
| 502 | 
            -
             | 
| 503 | 
            -
                            bSOURCE_LANGUAGE = gr.Dropdown(['Automatic detection', 'English (en)', 'French (fr)', 'German (de)', 'Spanish (es)', 'Italian (it)', 'Japanese (ja)', 'Chinese (zh)', 'Dutch (nl)', 'Ukrainian (uk)', 'Portuguese (pt)'], value='Automatic detection',label = 'Source language', info="This is the original language of the video")
         | 
| 504 | 
            -
                            bTRANSLATE_AUDIO_TO = gr.Dropdown(['English (en)', 'French (fr)', 'German (de)', 'Spanish (es)', 'Italian (it)', 'Japanese (ja)', 'Chinese (zh)', 'Dutch (nl)', 'Ukrainian (uk)', 'Portuguese (pt)'], value='English (en)',label = 'Translate audio to', info="Select the target language, and make sure to select the language corresponding to the speakers of the target language to avoid errors in the process.")
         | 
| 505 |  | 
| 506 | 
             
                            bline_ = gr.HTML("<hr></h2>")
         | 
| 507 | 
             
                            gr.Markdown("Select how many people are speaking in the video.")
         | 
| @@ -524,7 +792,7 @@ with gr.Blocks(theme=theme) as demo: | |
| 524 |  | 
| 525 | 
             
                            with gr.Column():
         | 
| 526 | 
             
                                  with gr.Accordion("Advanced Settings", open=False):
         | 
| 527 | 
            -
             | 
| 528 | 
             
                                      bAUDIO_MIX = gr.Dropdown(['Mixing audio with sidechain compression', 'Adjusting volumes and mixing audio'], value='Adjusting volumes and mixing audio', label = 'Audio Mixing Method', info="Mix original and translated audio files to create a customized, balanced output with two available mixing modes.")
         | 
| 529 |  | 
| 530 | 
             
                                      gr.HTML("<hr></h2>")
         | 
| @@ -537,18 +805,11 @@ with gr.Blocks(theme=theme) as demo: | |
| 537 | 
             
                                      bVIDEO_OUTPUT_NAME = gr.Textbox(label="Translated file name" ,value="video_output.mp4", info="The name of the output file")
         | 
| 538 | 
             
                                      bPREVIEW = gr.Checkbox(label="Preview", info="Preview cuts the video to only 10 seconds for testing purposes. Please deactivate it to retrieve the full video duration.")
         | 
| 539 |  | 
| 540 | 
            -
             | 
| 541 | 
            -
             | 
| 542 | 
            -
                            # text_button = gr.Button("Translate audio of video")
         | 
| 543 | 
            -
                            # link_output = gr.Video() #gr.outputs.File(label="Download!")
         | 
| 544 | 
            -
             | 
| 545 | 
            -
             | 
| 546 | 
            -
             | 
| 547 | 
             
                        with gr.Column(variant='compact'):
         | 
| 548 | 
             
                            with gr.Row():
         | 
| 549 | 
             
                                text_button = gr.Button("TRANSLATE")
         | 
| 550 | 
             
                            with gr.Row():
         | 
| 551 | 
            -
                                blink_output = gr. | 
| 552 |  | 
| 553 |  | 
| 554 | 
             
                            bline_ = gr.HTML("<hr></h2>")
         | 
| @@ -562,10 +823,10 @@ with gr.Blocks(theme=theme) as demo: | |
| 562 | 
             
                                    [
         | 
| 563 | 
             
                                        "https://www.youtube.com/watch?v=5ZeHtRKHl7Y",
         | 
| 564 | 
             
                                        "",
         | 
| 565 | 
            -
                                         | 
| 566 | 
            -
                                        " | 
| 567 | 
             
                                        16,
         | 
| 568 | 
            -
                                        " | 
| 569 | 
             
                                        "Japanese (ja)",
         | 
| 570 | 
             
                                        "English (en)",
         | 
| 571 | 
             
                                        1,
         | 
| @@ -602,15 +863,139 @@ with gr.Blocks(theme=theme) as demo: | |
| 602 | 
             
                                bAUDIO_MIX
         | 
| 603 | 
             
                                ],
         | 
| 604 | 
             
                                outputs=[blink_output],
         | 
| 605 | 
            -
                                cache_examples= | 
| 606 | 
             
                            )
         | 
| 607 |  | 
| 608 |  | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 609 |  | 
| 610 |  | 
| 611 | 
             
                with gr.Tab("Help"):
         | 
| 612 | 
            -
                    gr.Markdown(news)
         | 
| 613 | 
             
                    gr.Markdown(tutorial)
         | 
|  | |
| 614 |  | 
| 615 | 
             
                with gr.Accordion("Logs", open = False):
         | 
| 616 | 
             
                    logs = gr.Textbox()
         | 
| @@ -658,5 +1043,5 @@ with gr.Blocks(theme=theme) as demo: | |
| 658 | 
             
                    bAUDIO_MIX,
         | 
| 659 | 
             
                    ], outputs=blink_output)
         | 
| 660 |  | 
| 661 | 
            -
            demo.launch(enable_queue=True)
         | 
| 662 | 
            -
             | 
|  | |
| 1 | 
             
            #%cd SoniTranslate
         | 
| 2 | 
            +
            # vc infer pipe 161 np.int
         | 
| 3 | 
            +
            import os
         | 
| 4 | 
            +
            os.system("pip install -r requirements_colab.txt")
         | 
| 5 | 
            +
            os.system("pip install -r requirements_extra.txt")
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            os.system('apt install git-lfs')
         | 
| 8 | 
            +
            os.system('git lfs install')
         | 
| 9 | 
            +
            os.system('apt -y install -qq aria2')
         | 
| 10 | 
            +
            os.system('aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/hubert_base.pt -d . -o hubert_base.pt')
         | 
| 11 | 
            +
            os.system('wget https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/rmvpe.pt')
         | 
| 12 | 
            +
             | 
| 13 | 
             
            import numpy as np
         | 
| 14 | 
             
            import gradio as gr
         | 
| 15 | 
             
            import whisperx
         | 
| 16 | 
            +
            from whisperx.utils import LANGUAGES as LANG_TRANSCRIPT
         | 
| 17 | 
            +
            from whisperx.alignment import DEFAULT_ALIGN_MODELS_TORCH as DAMT, DEFAULT_ALIGN_MODELS_HF as DAMHF
         | 
| 18 | 
            +
            from IPython.utils import capture
         | 
| 19 | 
             
            import torch
         | 
| 20 | 
             
            from gtts import gTTS
         | 
| 21 | 
             
            import librosa
         | 
|  | |
| 29 | 
             
            from soni_translate.audio_segments import create_translated_audio
         | 
| 30 | 
             
            from soni_translate.text_to_speech import make_voice_gradio
         | 
| 31 | 
             
            from soni_translate.translate_segments import translate_text
         | 
| 32 | 
            +
            import time
         | 
| 33 | 
            +
            import shutil
         | 
| 34 | 
            +
            from urllib.parse import unquote
         | 
| 35 | 
            +
            import zipfile
         | 
| 36 | 
            +
            import rarfile
         | 
| 37 | 
            +
             | 
| 38 | 
            +
             | 
| 39 |  | 
| 40 | 
             
            title = "<center><strong><font size='7'>📽️ SoniTranslate 🈷️</font></strong></center>"
         | 
| 41 |  | 
| 42 | 
             
            news = """ ## 📖 News
         | 
| 43 | 
            +
                    🔥 2023/07/26: New UI and add mix options.
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                    🔥 2023/07/27: Fix some bug processing the video and audio.
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                    🔥 2023/08/01: Add options for use RVC models.
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                    🔥 2023/08/02: Added support for Arabic, Czech, Danish, Finnish, Greek, Hebrew, Hungarian, Korean, Persian, Polish, Russian, Turkish, Urdu, Hindi, and Vietnamese languages. 🌐
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                    🔥 2023/08/03: Changed default options and added directory view of downloads..
         | 
| 52 | 
             
                    """
         | 
| 53 |  | 
| 54 | 
            +
            description = """
         | 
| 55 | 
             
            ### 🎥 **Translate videos easily with SoniTranslate!** 📽️
         | 
| 56 |  | 
| 57 | 
             
            Upload a video or provide a video link. Limitation: 10 seconds for CPU, but no restrictions with a GPU.
         | 
|  | |
| 61 |  | 
| 62 | 
             
            📽️ **This a demo of SoniTranslate; GitHub repository: [SoniTranslate](https://github.com/R3gm/SoniTranslate)!**
         | 
| 63 |  | 
| 64 | 
            +
            See the tab labeled `Help` for instructions on how to use it. Let's start having fun with video translation! 🚀🎉
         | 
| 65 | 
             
            """
         | 
| 66 |  | 
| 67 |  | 
| 68 |  | 
| 69 | 
            +
            tutorial = """
         | 
| 70 | 
            +
             | 
| 71 | 
            +
            # 🔰 **Instructions for use:**
         | 
| 72 |  | 
| 73 | 
             
            1. 📤 **Upload a video** on the first tab or 🌐 **use a video link** on the second tab.
         | 
| 74 |  | 
|  | |
| 77 | 
             
            3. 🗣️ Specify the **number of people speaking** in the video and **assign each one a text-to-speech voice** suitable for the translation language.
         | 
| 78 |  | 
| 79 | 
             
            4. 🚀 Press the '**Translate**' button to obtain the results.
         | 
| 80 | 
            +
             | 
| 81 | 
            +
             | 
| 82 | 
            +
            # 🎤 How to Use RVC and RVC2 Voices 🎶
         | 
| 83 | 
            +
             | 
| 84 | 
            +
            The goal is to apply a RVC (Retrieval-based Voice Conversion) to the generated TTS (Text-to-Speech) 🎙️
         | 
| 85 | 
            +
             | 
| 86 | 
            +
            1. In the `Custom Voice RVC` tab, download the models you need 📥 You can use links from Hugging Face and Google Drive in formats like zip, pth, or index. You can also download complete HF space repositories, but this option is not very stable 😕
         | 
| 87 | 
            +
             | 
| 88 | 
            +
            2. Now, go to `Replace voice: TTS to RVC` and check the `enable` box ✅ After this, you can choose the models you want to apply to each TTS speaker 👩🦰👨🦱👩🦳👨🦲
         | 
| 89 | 
            +
             | 
| 90 | 
            +
            3. Adjust the F0 method that will be applied to all RVCs 🎛️
         | 
| 91 | 
            +
             | 
| 92 | 
            +
            4. Press `APPLY CONFIGURATION` to apply the changes you made 🔄
         | 
| 93 | 
            +
             | 
| 94 | 
            +
            5. Go back to the video translation tab and click on 'Translate' ▶️ Now, the translation will be done applying the RVCs 🗣️
         | 
| 95 | 
            +
             | 
| 96 | 
            +
            Tip: You can use `Test RVC` to experiment and find the best TTS or configurations to apply to the RVC 🧪🔍
         | 
| 97 | 
            +
             | 
| 98 | 
             
            """
         | 
| 99 |  | 
| 100 |  | 
|  | |
| 104 | 
             
                device = "cuda"
         | 
| 105 | 
             
                list_compute_type = ['float16', 'float32']
         | 
| 106 | 
             
                compute_type_default = 'float16'
         | 
| 107 | 
            +
                whisper_model_default = 'large-v2'
         | 
| 108 | 
             
            else:
         | 
| 109 | 
             
                device = "cpu"
         | 
| 110 | 
             
                list_compute_type = ['float32']
         | 
| 111 | 
             
                compute_type_default = 'float32'
         | 
| 112 | 
            +
                whisper_model_default = 'medium'
         | 
| 113 | 
             
            print('Working in: ', device)
         | 
| 114 |  | 
| 115 | 
             
            list_tts = ['af-ZA-AdriNeural-Female', 'af-ZA-WillemNeural-Male', 'am-ET-AmehaNeural-Male', 'am-ET-MekdesNeural-Female', 'ar-AE-FatimaNeural-Female', 'ar-AE-HamdanNeural-Male', 'ar-BH-AliNeural-Male', 'ar-BH-LailaNeural-Female', 'ar-DZ-AminaNeural-Female', 'ar-DZ-IsmaelNeural-Male', 'ar-EG-SalmaNeural-Female', 'ar-EG-ShakirNeural-Male', 'ar-IQ-BasselNeural-Male', 'ar-IQ-RanaNeural-Female', 'ar-JO-SanaNeural-Female', 'ar-JO-TaimNeural-Male', 'ar-KW-FahedNeural-Male', 'ar-KW-NouraNeural-Female', 'ar-LB-LaylaNeural-Female', 'ar-LB-RamiNeural-Male', 'ar-LY-ImanNeural-Female', 'ar-LY-OmarNeural-Male', 'ar-MA-JamalNeural-Male', 'ar-MA-MounaNeural-Female', 'ar-OM-AbdullahNeural-Male', 'ar-OM-AyshaNeural-Female', 'ar-QA-AmalNeural-Female', 'ar-QA-MoazNeural-Male', 'ar-SA-HamedNeural-Male', 'ar-SA-ZariyahNeural-Female', 'ar-SY-AmanyNeural-Female', 'ar-SY-LaithNeural-Male', 'ar-TN-HediNeural-Male', 'ar-TN-ReemNeural-Female', 'ar-YE-MaryamNeural-Female', 'ar-YE-SalehNeural-Male', 'az-AZ-BabekNeural-Male', 'az-AZ-BanuNeural-Female', 'bg-BG-BorislavNeural-Male', 'bg-BG-KalinaNeural-Female', 'bn-BD-NabanitaNeural-Female', 'bn-BD-PradeepNeural-Male', 'bn-IN-BashkarNeural-Male', 'bn-IN-TanishaaNeural-Female', 'bs-BA-GoranNeural-Male', 'bs-BA-VesnaNeural-Female', 'ca-ES-EnricNeural-Male', 'ca-ES-JoanaNeural-Female', 'cs-CZ-AntoninNeural-Male', 'cs-CZ-VlastaNeural-Female', 'cy-GB-AledNeural-Male', 'cy-GB-NiaNeural-Female', 'da-DK-ChristelNeural-Female', 'da-DK-JeppeNeural-Male', 'de-AT-IngridNeural-Female', 'de-AT-JonasNeural-Male', 'de-CH-JanNeural-Male', 'de-CH-LeniNeural-Female', 'de-DE-AmalaNeural-Female', 'de-DE-ConradNeural-Male', 'de-DE-KatjaNeural-Female', 'de-DE-KillianNeural-Male', 'el-GR-AthinaNeural-Female', 'el-GR-NestorasNeural-Male', 'en-AU-NatashaNeural-Female', 'en-AU-WilliamNeural-Male', 'en-CA-ClaraNeural-Female', 'en-CA-LiamNeural-Male', 'en-GB-LibbyNeural-Female', 'en-GB-MaisieNeural-Female', 'en-GB-RyanNeural-Male', 'en-GB-SoniaNeural-Female', 'en-GB-ThomasNeural-Male', 'en-HK-SamNeural-Male', 'en-HK-YanNeural-Female', 'en-IE-ConnorNeural-Male', 'en-IE-EmilyNeural-Female', 'en-IN-NeerjaExpressiveNeural-Female', 'en-IN-NeerjaNeural-Female', 'en-IN-PrabhatNeural-Male', 'en-KE-AsiliaNeural-Female', 'en-KE-ChilembaNeural-Male', 'en-NG-AbeoNeural-Male', 'en-NG-EzinneNeural-Female', 'en-NZ-MitchellNeural-Male', 'en-NZ-MollyNeural-Female', 'en-PH-JamesNeural-Male', 'en-PH-RosaNeural-Female', 'en-SG-LunaNeural-Female', 'en-SG-WayneNeural-Male', 'en-TZ-ElimuNeural-Male', 'en-TZ-ImaniNeural-Female', 'en-US-AnaNeural-Female', 'en-US-AriaNeural-Female', 'en-US-ChristopherNeural-Male', 'en-US-EricNeural-Male', 'en-US-GuyNeural-Male', 'en-US-JennyNeural-Female', 'en-US-MichelleNeural-Female', 'en-US-RogerNeural-Male', 'en-US-SteffanNeural-Male', 'en-ZA-LeahNeural-Female', 'en-ZA-LukeNeural-Male', 'es-AR-ElenaNeural-Female', 'es-AR-TomasNeural-Male', 'es-BO-MarceloNeural-Male', 'es-BO-SofiaNeural-Female', 'es-CL-CatalinaNeural-Female', 'es-CL-LorenzoNeural-Male', 'es-CO-GonzaloNeural-Male', 'es-CO-SalomeNeural-Female', 'es-CR-JuanNeural-Male', 'es-CR-MariaNeural-Female', 'es-CU-BelkysNeural-Female', 'es-CU-ManuelNeural-Male', 'es-DO-EmilioNeural-Male', 'es-DO-RamonaNeural-Female', 'es-EC-AndreaNeural-Female', 'es-EC-LuisNeural-Male', 'es-ES-AlvaroNeural-Male', 'es-ES-ElviraNeural-Female', 'es-GQ-JavierNeural-Male', 'es-GQ-TeresaNeural-Female', 'es-GT-AndresNeural-Male', 'es-GT-MartaNeural-Female', 'es-HN-CarlosNeural-Male', 'es-HN-KarlaNeural-Female', 'es-MX-DaliaNeural-Female', 'es-MX-JorgeNeural-Male', 'es-NI-FedericoNeural-Male', 'es-NI-YolandaNeural-Female', 'es-PA-MargaritaNeural-Female', 'es-PA-RobertoNeural-Male', 'es-PE-AlexNeural-Male', 'es-PE-CamilaNeural-Female', 'es-PR-KarinaNeural-Female', 'es-PR-VictorNeural-Male', 'es-PY-MarioNeural-Male', 'es-PY-TaniaNeural-Female', 'es-SV-LorenaNeural-Female', 'es-SV-RodrigoNeural-Male', 'es-US-AlonsoNeural-Male', 'es-US-PalomaNeural-Female', 'es-UY-MateoNeural-Male', 'es-UY-ValentinaNeural-Female', 'es-VE-PaolaNeural-Female', 'es-VE-SebastianNeural-Male', 'et-EE-AnuNeural-Female', 'et-EE-KertNeural-Male', 'fa-IR-DilaraNeural-Female', 'fa-IR-FaridNeural-Male', 'fi-FI-HarriNeural-Male', 'fi-FI-NooraNeural-Female', 'fil-PH-AngeloNeural-Male', 'fil-PH-BlessicaNeural-Female', 'fr-BE-CharlineNeural-Female', 'fr-BE-GerardNeural-Male', 'fr-CA-AntoineNeural-Male', 'fr-CA-JeanNeural-Male', 'fr-CA-SylvieNeural-Female', 'fr-CH-ArianeNeural-Female', 'fr-CH-FabriceNeural-Male', 'fr-FR-DeniseNeural-Female', 'fr-FR-EloiseNeural-Female', 'fr-FR-HenriNeural-Male', 'ga-IE-ColmNeural-Male', 'ga-IE-OrlaNeural-Female', 'gl-ES-RoiNeural-Male', 'gl-ES-SabelaNeural-Female', 'gu-IN-DhwaniNeural-Female', 'gu-IN-NiranjanNeural-Male', 'he-IL-AvriNeural-Male', 'he-IL-HilaNeural-Female', 'hi-IN-MadhurNeural-Male', 'hi-IN-SwaraNeural-Female', 'hr-HR-GabrijelaNeural-Female', 'hr-HR-SreckoNeural-Male', 'hu-HU-NoemiNeural-Female', 'hu-HU-TamasNeural-Male', 'id-ID-ArdiNeural-Male', 'id-ID-GadisNeural-Female', 'is-IS-GudrunNeural-Female', 'is-IS-GunnarNeural-Male', 'it-IT-DiegoNeural-Male', 'it-IT-ElsaNeural-Female', 'it-IT-IsabellaNeural-Female', 'ja-JP-KeitaNeural-Male', 'ja-JP-NanamiNeural-Female', 'jv-ID-DimasNeural-Male', 'jv-ID-SitiNeural-Female', 'ka-GE-EkaNeural-Female', 'ka-GE-GiorgiNeural-Male', 'kk-KZ-AigulNeural-Female', 'kk-KZ-DauletNeural-Male', 'km-KH-PisethNeural-Male', 'km-KH-SreymomNeural-Female', 'kn-IN-GaganNeural-Male', 'kn-IN-SapnaNeural-Female', 'ko-KR-InJoonNeural-Male', 'ko-KR-SunHiNeural-Female', 'lo-LA-ChanthavongNeural-Male', 'lo-LA-KeomanyNeural-Female', 'lt-LT-LeonasNeural-Male', 'lt-LT-OnaNeural-Female', 'lv-LV-EveritaNeural-Female', 'lv-LV-NilsNeural-Male', 'mk-MK-AleksandarNeural-Male', 'mk-MK-MarijaNeural-Female', 'ml-IN-MidhunNeural-Male', 'ml-IN-SobhanaNeural-Female', 'mn-MN-BataaNeural-Male', 'mn-MN-YesuiNeural-Female', 'mr-IN-AarohiNeural-Female', 'mr-IN-ManoharNeural-Male', 'ms-MY-OsmanNeural-Male', 'ms-MY-YasminNeural-Female', 'mt-MT-GraceNeural-Female', 'mt-MT-JosephNeural-Male', 'my-MM-NilarNeural-Female', 'my-MM-ThihaNeural-Male', 'nb-NO-FinnNeural-Male', 'nb-NO-PernilleNeural-Female', 'ne-NP-HemkalaNeural-Female', 'ne-NP-SagarNeural-Male', 'nl-BE-ArnaudNeural-Male', 'nl-BE-DenaNeural-Female', 'nl-NL-ColetteNeural-Female', 'nl-NL-FennaNeural-Female', 'nl-NL-MaartenNeural-Male', 'pl-PL-MarekNeural-Male', 'pl-PL-ZofiaNeural-Female', 'ps-AF-GulNawazNeural-Male', 'ps-AF-LatifaNeural-Female', 'pt-BR-AntonioNeural-Male', 'pt-BR-FranciscaNeural-Female', 'pt-PT-DuarteNeural-Male', 'pt-PT-RaquelNeural-Female', 'ro-RO-AlinaNeural-Female', 'ro-RO-EmilNeural-Male', 'ru-RU-DmitryNeural-Male', 'ru-RU-SvetlanaNeural-Female', 'si-LK-SameeraNeural-Male', 'si-LK-ThiliniNeural-Female', 'sk-SK-LukasNeural-Male', 'sk-SK-ViktoriaNeural-Female', 'sl-SI-PetraNeural-Female', 'sl-SI-RokNeural-Male', 'so-SO-MuuseNeural-Male', 'so-SO-UbaxNeural-Female', 'sq-AL-AnilaNeural-Female', 'sq-AL-IlirNeural-Male', 'sr-RS-NicholasNeural-Male', 'sr-RS-SophieNeural-Female', 'su-ID-JajangNeural-Male', 'su-ID-TutiNeural-Female', 'sv-SE-MattiasNeural-Male', 'sv-SE-SofieNeural-Female', 'sw-KE-RafikiNeural-Male', 'sw-KE-ZuriNeural-Female', 'sw-TZ-DaudiNeural-Male', 'sw-TZ-RehemaNeural-Female', 'ta-IN-PallaviNeural-Female', 'ta-IN-ValluvarNeural-Male', 'ta-LK-KumarNeural-Male', 'ta-LK-SaranyaNeural-Female', 'ta-MY-KaniNeural-Female', 'ta-MY-SuryaNeural-Male', 'ta-SG-AnbuNeural-Male', 'ta-SG-VenbaNeural-Female', 'te-IN-MohanNeural-Male', 'te-IN-ShrutiNeural-Female', 'th-TH-NiwatNeural-Male', 'th-TH-PremwadeeNeural-Female', 'tr-TR-AhmetNeural-Male', 'tr-TR-EmelNeural-Female', 'uk-UA-OstapNeural-Male', 'uk-UA-PolinaNeural-Female', 'ur-IN-GulNeural-Female', 'ur-IN-SalmanNeural-Male', 'ur-PK-AsadNeural-Male', 'ur-PK-UzmaNeural-Female', 'uz-UZ-MadinaNeural-Female', 'uz-UZ-SardorNeural-Male', 'vi-VN-HoaiMyNeural-Female', 'vi-VN-NamMinhNeural-Male', 'zh-CN-XiaoxiaoNeural-Female', 'zh-CN-XiaoyiNeural-Female', 'zh-CN-YunjianNeural-Male', 'zh-CN-YunxiNeural-Male', 'zh-CN-YunxiaNeural-Male', 'zh-CN-YunyangNeural-Male', 'zh-CN-liaoning-XiaobeiNeural-Female', 'zh-CN-shaanxi-XiaoniNeural-Female']
         | 
| 116 |  | 
| 117 | 
            +
            ### voices
         | 
| 118 | 
            +
            with capture.capture_output() as cap:
         | 
| 119 | 
            +
                os.system('mkdir downloads')
         | 
| 120 | 
            +
                os.system('mkdir logs')
         | 
| 121 | 
            +
                os.system('mkdir weights')
         | 
| 122 | 
            +
                os.system('mkdir downloads')
         | 
| 123 | 
            +
                del cap
         | 
| 124 | 
            +
             | 
| 125 | 
            +
             | 
| 126 | 
            +
            def print_tree_directory(root_dir, indent=''):
         | 
| 127 | 
            +
                if not os.path.exists(root_dir):
         | 
| 128 | 
            +
                    print(f"{indent}Invalid directory or file: {root_dir}")
         | 
| 129 | 
            +
                    return
         | 
| 130 | 
            +
             | 
| 131 | 
            +
                items = os.listdir(root_dir)
         | 
| 132 | 
            +
             | 
| 133 | 
            +
                for index, item in enumerate(sorted(items)):
         | 
| 134 | 
            +
                    item_path = os.path.join(root_dir, item)
         | 
| 135 | 
            +
                    is_last_item = index == len(items) - 1
         | 
| 136 | 
            +
             | 
| 137 | 
            +
                    if os.path.isfile(item_path) and item_path.endswith('.zip'):
         | 
| 138 | 
            +
                        with zipfile.ZipFile(item_path, 'r') as zip_file:
         | 
| 139 | 
            +
                            print(f"{indent}{'└──' if is_last_item else '├──'} {item} (zip file)")
         | 
| 140 | 
            +
                            zip_contents = zip_file.namelist()
         | 
| 141 | 
            +
                            for zip_item in sorted(zip_contents):
         | 
| 142 | 
            +
                                print(f"{indent}{'    ' if is_last_item else '│   '}{zip_item}")
         | 
| 143 | 
            +
                    else:
         | 
| 144 | 
            +
                        print(f"{indent}{'└──' if is_last_item else '├──'} {item}")
         | 
| 145 | 
            +
             | 
| 146 | 
            +
                        if os.path.isdir(item_path):
         | 
| 147 | 
            +
                            new_indent = indent + ('    ' if is_last_item else '│   ')
         | 
| 148 | 
            +
                            print_tree_directory(item_path, new_indent)
         | 
| 149 | 
            +
             | 
| 150 | 
            +
             | 
| 151 | 
            +
            def upload_model_list():
         | 
| 152 | 
            +
                weight_root = "weights"
         | 
| 153 | 
            +
                models = []
         | 
| 154 | 
            +
                for name in os.listdir(weight_root):
         | 
| 155 | 
            +
                    if name.endswith(".pth"):
         | 
| 156 | 
            +
                        models.append(name)
         | 
| 157 | 
            +
             | 
| 158 | 
            +
                index_root = "logs"
         | 
| 159 | 
            +
                index_paths = []
         | 
| 160 | 
            +
                for name in os.listdir(index_root):
         | 
| 161 | 
            +
                    if name.endswith(".index"):
         | 
| 162 | 
            +
                        index_paths.append("logs/"+name)
         | 
| 163 | 
            +
             | 
| 164 | 
            +
                print(models, index_paths)
         | 
| 165 | 
            +
                return models, index_paths
         | 
| 166 | 
            +
             | 
| 167 | 
            +
            def manual_download(url, dst):
         | 
| 168 | 
            +
                token = os.getenv("YOUR_HF_TOKEN")
         | 
| 169 | 
            +
                user_header = f"\"Authorization: Bearer {token}\""
         | 
| 170 | 
            +
             | 
| 171 | 
            +
                if 'drive.google' in url:
         | 
| 172 | 
            +
                    print("Drive link")
         | 
| 173 | 
            +
                    if 'folders' in url:
         | 
| 174 | 
            +
                        print("folder")
         | 
| 175 | 
            +
                        os.system(f'gdown --folder "{url}" -O {dst} --fuzzy -c')
         | 
| 176 | 
            +
                    else:
         | 
| 177 | 
            +
                        print("single")
         | 
| 178 | 
            +
                        os.system(f'gdown "{url}" -O {dst} --fuzzy -c')
         | 
| 179 | 
            +
                elif 'huggingface' in url:
         | 
| 180 | 
            +
                    print("HuggingFace link")
         | 
| 181 | 
            +
                    if '/blob/' in url or '/resolve/' in url:
         | 
| 182 | 
            +
                      if '/blob/' in url:
         | 
| 183 | 
            +
                          url = url.replace('/blob/', '/resolve/')
         | 
| 184 | 
            +
                      #parsed_link = '\n{}\n\tout={}'.format(url, unquote(url.split('/')[-1]))
         | 
| 185 | 
            +
                      #os.system(f'echo -e "{parsed_link}" | aria2c --header={user_header} --console-log-level=error --summary-interval=10 -i- -j5 -x16 -s16 -k1M -c -d "{dst}"')
         | 
| 186 | 
            +
                      os.system(f"wget -P {dst} {url}")
         | 
| 187 | 
            +
                    else:
         | 
| 188 | 
            +
                      os.system(f"git clone {url} {dst+'repo/'}")
         | 
| 189 | 
            +
                elif 'http' in url or 'magnet' in url:
         | 
| 190 | 
            +
                    parsed_link = '"{}"'.format(url)
         | 
| 191 | 
            +
                    os.system(f'aria2c --optimize-concurrent-downloads --console-log-level=error --summary-interval=10 -j5 -x16 -s16 -k1M -c -d {dst} -Z {parsed_link}')
         | 
| 192 | 
            +
             | 
| 193 | 
            +
             | 
| 194 | 
            +
            def download_list(text_downloads):
         | 
| 195 | 
            +
                try:
         | 
| 196 | 
            +
                  urls = [elem.strip() for elem in text_downloads.split(',')]
         | 
| 197 | 
            +
                except:
         | 
| 198 | 
            +
                  return 'No valid link'
         | 
| 199 | 
            +
             | 
| 200 | 
            +
                os.system('mkdir downloads')
         | 
| 201 | 
            +
                os.system('mkdir logs')
         | 
| 202 | 
            +
                os.system('mkdir weights')
         | 
| 203 | 
            +
                path_download = "downloads/"
         | 
| 204 | 
            +
                for url in urls:
         | 
| 205 | 
            +
                  manual_download(url, path_download)
         | 
| 206 | 
            +
                
         | 
| 207 | 
            +
                # Tree
         | 
| 208 | 
            +
                print('####################################')
         | 
| 209 | 
            +
                print_tree_directory("downloads", indent='')
         | 
| 210 | 
            +
                print('####################################')
         | 
| 211 | 
            +
             | 
| 212 | 
            +
                # Place files
         | 
| 213 | 
            +
                select_zip_and_rar_files("downloads/")
         | 
| 214 | 
            +
             | 
| 215 | 
            +
                models, _ = upload_model_list()
         | 
| 216 | 
            +
                os.system("rm -rf downloads/repo")
         | 
| 217 | 
            +
             | 
| 218 | 
            +
                return f"Downloaded = {models}"
         | 
| 219 | 
            +
             | 
| 220 | 
            +
             | 
| 221 | 
            +
            def select_zip_and_rar_files(directory_path="downloads/"):
         | 
| 222 | 
            +
                #filter
         | 
| 223 | 
            +
                zip_files = []
         | 
| 224 | 
            +
                rar_files = []
         | 
| 225 | 
            +
             | 
| 226 | 
            +
                for file_name in os.listdir(directory_path):
         | 
| 227 | 
            +
                    if file_name.endswith(".zip"):
         | 
| 228 | 
            +
                        zip_files.append(file_name)
         | 
| 229 | 
            +
                    elif file_name.endswith(".rar"):
         | 
| 230 | 
            +
                        rar_files.append(file_name)
         | 
| 231 | 
            +
             | 
| 232 | 
            +
                # extract
         | 
| 233 | 
            +
                for file_name in zip_files:
         | 
| 234 | 
            +
                    file_path = os.path.join(directory_path, file_name)
         | 
| 235 | 
            +
                    with zipfile.ZipFile(file_path, 'r') as zip_ref:
         | 
| 236 | 
            +
                        zip_ref.extractall(directory_path)
         | 
| 237 | 
            +
             | 
| 238 | 
            +
                for file_name in rar_files:
         | 
| 239 | 
            +
                    file_path = os.path.join(directory_path, file_name)
         | 
| 240 | 
            +
                    with rarfile.RarFile(file_path, 'r') as rar_ref:
         | 
| 241 | 
            +
                        rar_ref.extractall(directory_path)
         | 
| 242 | 
            +
             | 
| 243 | 
            +
                # set in path
         | 
| 244 | 
            +
                def move_files_with_extension(src_dir, extension, destination_dir):
         | 
| 245 | 
            +
                    for root, _, files in os.walk(src_dir):
         | 
| 246 | 
            +
                        for file_name in files:
         | 
| 247 | 
            +
                            if file_name.endswith(extension):
         | 
| 248 | 
            +
                                source_file = os.path.join(root, file_name)
         | 
| 249 | 
            +
                                destination = os.path.join(destination_dir, file_name)
         | 
| 250 | 
            +
                                shutil.move(source_file, destination)
         | 
| 251 | 
            +
             | 
| 252 | 
            +
                move_files_with_extension(directory_path, ".index", "logs/")
         | 
| 253 | 
            +
                move_files_with_extension(directory_path, ".pth", "weights/")
         | 
| 254 | 
            +
             | 
| 255 | 
            +
                return 'Download complete'
         | 
| 256 | 
            +
             | 
| 257 | 
            +
            def custom_model_voice_enable(enable_custom_voice):
         | 
| 258 | 
            +
                if enable_custom_voice:
         | 
| 259 | 
            +
                  os.environ["VOICES_MODELS"] = 'ENABLE'
         | 
| 260 | 
            +
                else:
         | 
| 261 | 
            +
                  os.environ["VOICES_MODELS"] = 'DISABLE'
         | 
| 262 | 
            +
             | 
| 263 | 
            +
             | 
| 264 | 
            +
            models, index_paths = upload_model_list()
         | 
| 265 | 
            +
             | 
| 266 | 
            +
            f0_methods_voice = ["pm", "harvest", "crepe", "rmvpe"]
         | 
| 267 | 
            +
             | 
| 268 | 
            +
             | 
| 269 | 
            +
            from voice_main import ClassVoices
         | 
| 270 | 
            +
            voices = ClassVoices()
         | 
| 271 | 
            +
             | 
| 272 | 
             
            '''
         | 
| 273 | 
             
            def translate_from_video(video, WHISPER_MODEL_SIZE, batch_size, compute_type,
         | 
| 274 | 
             
                                     TRANSLATE_AUDIO_TO, min_speakers, max_speakers,
         | 
|  | |
| 309 | 
             
                tts_voice05="en-GB-MaisieNeural-Female",
         | 
| 310 | 
             
                video_output="video_dub.mp4",
         | 
| 311 | 
             
                AUDIO_MIX_METHOD='Adjusting volumes and mixing audio',
         | 
| 312 | 
            +
                progress=gr.Progress(),
         | 
| 313 | 
             
                ):
         | 
| 314 |  | 
| 315 | 
             
                if YOUR_HF_TOKEN == "" or YOUR_HF_TOKEN == None:
         | 
| 316 | 
             
                  YOUR_HF_TOKEN = os.getenv("YOUR_HF_TOKEN")
         | 
| 317 | 
             
                  if YOUR_HF_TOKEN == None:
         | 
| 318 | 
             
                    print('No valid token')
         | 
| 319 | 
            +
                    return "No valid token"
         | 
| 320 | 
            +
                  else:
         | 
| 321 | 
            +
                    os.environ["YOUR_HF_TOKEN"] = YOUR_HF_TOKEN
         | 
| 322 | 
            +
             | 
| 323 | 
            +
                video = video if isinstance(video, str) else video.name
         | 
| 324 | 
            +
                print(video)
         | 
| 325 |  | 
| 326 | 
             
                if "SET_LIMIT" == os.getenv("DEMO"):
         | 
| 327 | 
             
                  preview=True
         | 
| 328 | 
             
                  print("DEMO; set preview=True; The generation is **limited to 10 seconds** to prevent errors with the CPU. If you use a GPU, you won't have any of these limitations.")
         | 
| 329 | 
             
                  AUDIO_MIX_METHOD='Adjusting volumes and mixing audio'
         | 
| 330 | 
             
                  print("DEMO; set Adjusting volumes and mixing audio")
         | 
| 331 | 
            +
                  WHISPER_MODEL_SIZE="medium"
         | 
| 332 | 
            +
                  print("DEMO; set whisper model to medium")
         | 
| 333 |  | 
| 334 | 
             
                LANGUAGES = {
         | 
| 335 | 
             
                    'Automatic detection': 'Automatic detection',
         | 
| 336 | 
            +
                    'Arabic (ar)': 'ar',
         | 
| 337 | 
            +
                    'Chinese (zh)': 'zh',
         | 
| 338 | 
            +
                    'Czech (cs)': 'cs',
         | 
| 339 | 
            +
                    'Danish (da)': 'da',
         | 
| 340 | 
            +
                    'Dutch (nl)': 'nl',
         | 
| 341 | 
             
                    'English (en)': 'en',
         | 
| 342 | 
            +
                    'Finnish (fi)': 'fi',
         | 
| 343 | 
             
                    'French (fr)': 'fr',
         | 
| 344 | 
             
                    'German (de)': 'de',
         | 
| 345 | 
            +
                    'Greek (el)': 'el',
         | 
| 346 | 
            +
                    'Hebrew (he)': 'he',
         | 
| 347 | 
            +
                    'Hungarian (hu)': 'hu',
         | 
| 348 | 
             
                    'Italian (it)': 'it',
         | 
| 349 | 
             
                    'Japanese (ja)': 'ja',
         | 
| 350 | 
            +
                    'Korean (ko)': 'ko',
         | 
| 351 | 
            +
                    'Persian (fa)': 'fa',
         | 
| 352 | 
            +
                    'Polish (pl)': 'pl',
         | 
| 353 | 
            +
                    'Portuguese (pt)': 'pt',
         | 
| 354 | 
            +
                    'Russian (ru)': 'ru',
         | 
| 355 | 
            +
                    'Spanish (es)': 'es',
         | 
| 356 | 
            +
                    'Turkish (tr)': 'tr',
         | 
| 357 | 
             
                    'Ukrainian (uk)': 'uk',
         | 
| 358 | 
            +
                    'Urdu (ur)': 'ur',
         | 
| 359 | 
            +
                    'Vietnamese (vi)': 'vi',
         | 
| 360 | 
            +
                    'Hindi (hi)': 'hi',
         | 
| 361 | 
             
                }
         | 
| 362 |  | 
| 363 | 
             
                TRANSLATE_AUDIO_TO = LANGUAGES[TRANSLATE_AUDIO_TO]
         | 
|  | |
| 383 | 
             
                os.system("rm audio.webm")
         | 
| 384 | 
             
                os.system("rm audio.wav")
         | 
| 385 |  | 
| 386 | 
            +
                progress(0.15, desc="Processing video...")
         | 
| 387 | 
             
                if os.path.exists(video):
         | 
| 388 | 
             
                    if preview:
         | 
| 389 | 
             
                        print('Creating a preview video of 10 seconds, to disable this option, go to advanced settings and turn off preview.')
         | 
| 390 | 
             
                        os.system(f'ffmpeg -y -i "{video}" -ss 00:00:20 -t 00:00:10 -c:v libx264 -c:a aac -strict experimental Video.mp4')
         | 
| 391 | 
             
                    else:
         | 
| 392 | 
            +
                        # Check if the file ends with ".mp4" extension
         | 
| 393 | 
            +
                        if video.endswith(".mp4"):
         | 
| 394 | 
            +
                            destination_path = os.path.join(os.getcwd(), "Video.mp4")
         | 
| 395 | 
            +
                            shutil.copy(video, destination_path)
         | 
| 396 | 
            +
                        else:
         | 
| 397 | 
            +
                            print("File does not have the '.mp4' extension. Converting video.")
         | 
| 398 | 
            +
                            os.system(f'ffmpeg -y -i "{video}" -c:v libx264 -c:a aac -strict experimental Video.mp4')
         | 
| 399 | 
            +
             | 
| 400 | 
            +
                    for i in range (120):
         | 
| 401 | 
            +
                        time.sleep(1)
         | 
| 402 | 
            +
                        print('process video...')
         | 
| 403 | 
            +
                        if os.path.exists(OutputFile):
         | 
| 404 | 
            +
                            time.sleep(1)
         | 
| 405 | 
            +
                            os.system("ffmpeg -y -i Video.mp4 -vn -acodec pcm_s16le -ar 44100 -ac 2 audio.wav")
         | 
| 406 | 
            +
                            time.sleep(1)
         | 
| 407 | 
            +
                            break
         | 
| 408 | 
            +
                        if i == 119:
         | 
| 409 | 
            +
                          print('Error processing video')
         | 
| 410 | 
            +
                          return
         | 
| 411 | 
            +
             | 
| 412 | 
            +
                    for i in range (120):
         | 
| 413 | 
            +
                        time.sleep(1)
         | 
| 414 | 
            +
                        print('process audio...')
         | 
| 415 | 
            +
                        if os.path.exists(audio_wav):
         | 
| 416 | 
            +
                            break
         | 
| 417 | 
            +
                        if i == 119:
         | 
| 418 | 
            +
                          print("Error can't create the audio")
         | 
| 419 | 
            +
                          return
         | 
| 420 |  | 
|  | |
| 421 | 
             
                else:
         | 
| 422 | 
             
                    if preview:
         | 
| 423 | 
             
                        print('Creating a preview from the link, 10 seconds to disable this option, go to advanced settings and turn off preview.')
         | 
|  | |
| 444 | 
             
                              return
         | 
| 445 |  | 
| 446 | 
             
                print("Set file complete.")
         | 
| 447 | 
            +
                progress(0.30, desc="Transcribing...")
         | 
| 448 |  | 
| 449 | 
             
                SOURCE_LANGUAGE = None if SOURCE_LANGUAGE == 'Automatic detection' else SOURCE_LANGUAGE
         | 
| 450 |  | 
| 451 | 
             
                # 1. Transcribe with original whisper (batched)
         | 
| 452 | 
            +
                with capture.capture_output() as cap:
         | 
| 453 | 
            +
                  model = whisperx.load_model(
         | 
| 454 | 
            +
                      WHISPER_MODEL_SIZE,
         | 
| 455 | 
            +
                      device,
         | 
| 456 | 
            +
                      compute_type=compute_type,
         | 
| 457 | 
            +
                      language= SOURCE_LANGUAGE,
         | 
| 458 | 
            +
                      )
         | 
| 459 | 
            +
                  del cap
         | 
| 460 | 
             
                audio = whisperx.load_audio(audio_wav)
         | 
| 461 | 
             
                result = model.transcribe(audio, batch_size=batch_size)
         | 
| 462 | 
             
                gc.collect(); torch.cuda.empty_cache(); del model
         | 
| 463 | 
             
                print("Transcript complete")
         | 
| 464 |  | 
| 465 | 
            +
                
         | 
| 466 | 
            +
             | 
| 467 | 
             
                # 2. Align whisper output
         | 
| 468 | 
            +
                progress(0.45, desc="Aligning...")
         | 
| 469 | 
            +
                DAMHF.update(DAMT) #lang align
         | 
| 470 | 
            +
                EXTRA_ALIGN = {
         | 
| 471 | 
            +
                    "hi": "theainerd/Wav2Vec2-large-xlsr-hindi"
         | 
| 472 | 
            +
                } # add new align models here
         | 
| 473 | 
            +
                #print(result['language'], DAM.keys(), EXTRA_ALIGN.keys())
         | 
| 474 | 
            +
                if not result['language'] in DAMHF.keys() and not result['language'] in EXTRA_ALIGN.keys():
         | 
| 475 | 
            +
                    audio = result = None
         | 
| 476 | 
            +
                    print("Automatic detection: Source language not incompatible")
         | 
| 477 | 
            +
                    print(f"Detected language {LANG_TRANSCRIPT[result['language']]}  incompatible, you can select the source language to avoid this error.")
         | 
| 478 | 
            +
                    return
         | 
| 479 | 
            +
             | 
| 480 | 
             
                model_a, metadata = whisperx.load_align_model(
         | 
| 481 | 
             
                    language_code=result["language"],
         | 
| 482 | 
            +
                    device=device,
         | 
| 483 | 
            +
                    model_name = None if result["language"] in DAMHF.keys() else EXTRA_ALIGN[result["language"]]
         | 
| 484 | 
             
                    )
         | 
| 485 | 
             
                result = whisperx.align(
         | 
| 486 | 
             
                    result["segments"],
         | 
|  | |
| 494 | 
             
                print("Align complete")
         | 
| 495 |  | 
| 496 | 
             
                if result['segments'] == []:
         | 
| 497 | 
            +
                    print('No active speech found in audio')
         | 
| 498 | 
            +
                    return
         | 
| 499 |  | 
| 500 | 
             
                # 3. Assign speaker labels
         | 
| 501 | 
            +
                progress(0.60, desc="Diarizing...")
         | 
| 502 | 
            +
                with capture.capture_output() as cap:
         | 
| 503 | 
            +
                  diarize_model = whisperx.DiarizationPipeline(use_auth_token=YOUR_HF_TOKEN, device=device)
         | 
| 504 | 
            +
                  del cap
         | 
| 505 | 
             
                diarize_segments = diarize_model(
         | 
| 506 | 
             
                    audio_wav,
         | 
| 507 | 
             
                    min_speakers=min_speakers,
         | 
|  | |
| 510 | 
             
                gc.collect(); torch.cuda.empty_cache(); del diarize_model
         | 
| 511 | 
             
                print("Diarize complete")
         | 
| 512 |  | 
| 513 | 
            +
                progress(0.75, desc="Translating...")
         | 
| 514 | 
            +
                if TRANSLATE_AUDIO_TO == "zh":
         | 
| 515 | 
            +
                    TRANSLATE_AUDIO_TO = "zh-CN"
         | 
| 516 | 
            +
                if TRANSLATE_AUDIO_TO == "he":
         | 
| 517 | 
            +
                    TRANSLATE_AUDIO_TO = "iw"
         | 
| 518 | 
             
                result_diarize['segments'] = translate_text(result_diarize['segments'], TRANSLATE_AUDIO_TO)
         | 
| 519 | 
             
                print("Translation complete")
         | 
| 520 |  | 
| 521 | 
            +
                progress(0.85, desc="Text_to_speech...")
         | 
| 522 | 
             
                audio_files = []
         | 
| 523 | 
            +
                speakers_list = []
         | 
| 524 |  | 
| 525 | 
             
                # Mapping speakers to voice variables
         | 
| 526 | 
             
                speaker_to_voice = {
         | 
|  | |
| 543 | 
             
                    except KeyError:
         | 
| 544 | 
             
                        segment['speaker'] = "SPEAKER_99"
         | 
| 545 | 
             
                        speaker = segment['speaker']
         | 
| 546 | 
            +
                        print(f"NO SPEAKER DETECT IN SEGMENT: TTS auxiliary will be used in the segment time {segment['start'], segment['text']}")
         | 
| 547 |  | 
| 548 | 
             
                    # make the tts audio
         | 
| 549 | 
             
                    filename = f"audio/{start}.ogg"
         | 
|  | |
| 582 |  | 
| 583 | 
             
                    duration_create = librosa.get_duration(filename=f"audio2/{filename}")
         | 
| 584 | 
             
                    audio_files.append(filename)
         | 
| 585 | 
            +
                    speakers_list.append(speaker)
         | 
| 586 | 
            +
             | 
| 587 | 
            +
                # custom voice
         | 
| 588 | 
            +
                if os.getenv('VOICES_MODELS') == 'ENABLE':
         | 
| 589 | 
            +
                    progress(0.90, desc="Applying customized voices...")
         | 
| 590 | 
            +
                    voices(speakers_list, audio_files)
         | 
| 591 |  | 
| 592 | 
             
                # replace files with the accelerates
         | 
| 593 | 
             
                os.system("mv -f audio2/audio/*.ogg audio/")
         | 
| 594 |  | 
| 595 | 
             
                os.system(f"rm {Output_name_file}")
         | 
| 596 | 
            +
             | 
| 597 | 
            +
                progress(0.95, desc="Creating final translated video...")
         | 
| 598 | 
            +
             | 
| 599 | 
             
                create_translated_audio(result_diarize, audio_files, Output_name_file)
         | 
| 600 |  | 
| 601 | 
             
                os.system(f"rm {mix_audio}")
         | 
|  | |
| 610 | 
             
                        os.system(f'ffmpeg -i {audio_wav} -i {Output_name_file} -filter_complex "[1:a]asplit=2[sc][mix];[0:a][sc]sidechaincompress=threshold=0.003:ratio=20[bg]; [bg][mix]amerge[final]" -map [final] {mix_audio}')
         | 
| 611 | 
             
                    except:
         | 
| 612 | 
             
                        # volume mix except
         | 
| 613 | 
            +
                        os.system(f'ffmpeg -y -i {audio_wav} -i {Output_name_file} -filter_complex "[0:0]volume=0.25[a];[1:0]volume=1.80[b];[a][b]amix=inputs=2:duration=longest" -c:a libmp3lame {mix_audio}')
         | 
| 614 |  | 
| 615 | 
             
                os.system(f"rm {video_output}")
         | 
| 616 | 
             
                os.system(f"ffmpeg -i {OutputFile} -i {mix_audio} -c:v copy -c:a copy -map 0:v -map 1:a -shortest {video_output}")
         | 
|  | |
| 642 | 
             
                with open("output.log", "r") as f:
         | 
| 643 | 
             
                    return f.read()
         | 
| 644 |  | 
| 645 | 
            +
            def submit_file_func(file):
         | 
| 646 | 
            +
                print(file.name)
         | 
| 647 | 
            +
                return file.name, file.name
         | 
| 648 | 
            +
             | 
| 649 | 
             
            # max tts
         | 
| 650 | 
             
            MAX_TTS = 6
         | 
| 651 |  | 
|  | |
| 656 | 
             
                gr.Markdown(description)
         | 
| 657 |  | 
| 658 | 
             
            #### video
         | 
| 659 | 
            +
                with gr.Tab("Audio Translation for a Video"):
         | 
| 660 | 
             
                    with gr.Row():
         | 
| 661 | 
             
                        with gr.Column():
         | 
| 662 | 
            +
                            #video_input = gr.UploadButton("Click to Upload a video", file_types=["video"], file_count="single") #gr.Video() # height=300,width=300
         | 
| 663 | 
            +
                            video_input = gr.File(label="VIDEO")
         | 
| 664 | 
            +
                            #link = gr.HTML()
         | 
| 665 | 
            +
                            #video_input.change(submit_file_func, video_input, [video_input, link], show_progress='full')
         | 
| 666 | 
            +
             | 
| 667 | 
            +
                            SOURCE_LANGUAGE = gr.Dropdown(['Automatic detection', 'Arabic (ar)', 'Chinese (zh)', 'Czech (cs)', 'Danish (da)', 'Dutch (nl)', 'English (en)', 'Finnish (fi)', 'French (fr)', 'German (de)', 'Greek (el)', 'Hebrew (he)', 'Hindi (hi)', 'Hungarian (hu)', 'Italian (it)', 'Japanese (ja)', 'Korean (ko)', 'Persian (fa)', 'Polish (pl)', 'Portuguese (pt)', 'Russian (ru)', 'Spanish (es)', 'Turkish (tr)', 'Ukrainian (uk)', 'Urdu (ur)', 'Vietnamese (vi)'], value='Automatic detection',label = 'Source language', info="This is the original language of the video")
         | 
| 668 | 
            +
                            TRANSLATE_AUDIO_TO = gr.Dropdown(['Arabic (ar)', 'Chinese (zh)', 'Czech (cs)', 'Danish (da)', 'Dutch (nl)', 'English (en)', 'Finnish (fi)', 'French (fr)', 'German (de)', 'Greek (el)', 'Hebrew (he)', 'Hindi (hi)', 'Hungarian (hu)', 'Italian (it)', 'Japanese (ja)', 'Korean (ko)', 'Persian (fa)', 'Polish (pl)', 'Portuguese (pt)', 'Russian (ru)', 'Spanish (es)', 'Turkish (tr)', 'Ukrainian (uk)', 'Urdu (ur)', 'Vietnamese (vi)'], value='English (en)',label = 'Translate audio to', info="Select the target language, and make sure to select the language corresponding to the speakers of the target language to avoid errors in the process.")
         | 
| 669 |  | 
| 670 | 
             
                            line_ = gr.HTML("<hr></h2>")
         | 
| 671 | 
             
                            gr.Markdown("Select how many people are speaking in the video.")
         | 
|  | |
| 687 |  | 
| 688 | 
             
                            with gr.Column():
         | 
| 689 | 
             
                                  with gr.Accordion("Advanced Settings", open=False):
         | 
| 690 | 
            +
             | 
| 691 | 
             
                                      AUDIO_MIX = gr.Dropdown(['Mixing audio with sidechain compression', 'Adjusting volumes and mixing audio'], value='Adjusting volumes and mixing audio', label = 'Audio Mixing Method', info="Mix original and translated audio files to create a customized, balanced output with two available mixing modes.")
         | 
| 692 | 
            +
             | 
| 693 | 
             
                                      gr.HTML("<hr></h2>")
         | 
| 694 | 
             
                                      gr.Markdown("Default configuration of Whisper.")
         | 
| 695 | 
             
                                      WHISPER_MODEL_SIZE = gr.inputs.Dropdown(['tiny', 'base', 'small', 'medium', 'large-v1', 'large-v2'], default=whisper_model_default, label="Whisper model")
         | 
| 696 | 
             
                                      batch_size = gr.inputs.Slider(1, 32, default=16, label="Batch size", step=1)
         | 
| 697 | 
             
                                      compute_type = gr.inputs.Dropdown(list_compute_type, default=compute_type_default, label="Compute type")
         | 
| 698 | 
            +
             | 
| 699 | 
             
                                      gr.HTML("<hr></h2>")
         | 
| 700 | 
             
                                      VIDEO_OUTPUT_NAME = gr.Textbox(label="Translated file name" ,value="video_output.mp4", info="The name of the output file")
         | 
| 701 | 
             
                                      PREVIEW = gr.Checkbox(label="Preview", info="Preview cuts the video to only 10 seconds for testing purposes. Please deactivate it to retrieve the full video duration.")
         | 
|  | |
| 704 | 
             
                            with gr.Row():
         | 
| 705 | 
             
                                video_button = gr.Button("TRANSLATE", )
         | 
| 706 | 
             
                            with gr.Row():
         | 
| 707 | 
            +
                                video_output = gr.outputs.File(label="DOWNLOAD TRANSLATED VIDEO") #gr.Video()
         | 
| 708 |  | 
| 709 | 
             
                            line_ = gr.HTML("<hr></h2>")
         | 
| 710 | 
             
                            if os.getenv("YOUR_HF_TOKEN") == None or os.getenv("YOUR_HF_TOKEN") == "":
         | 
|  | |
| 717 | 
             
                                    [
         | 
| 718 | 
             
                                        "./assets/Video_main.mp4",
         | 
| 719 | 
             
                                        "",
         | 
| 720 | 
            +
                                        False,
         | 
| 721 | 
            +
                                        "large-v2",
         | 
| 722 | 
             
                                        16,
         | 
| 723 | 
            +
                                        "float16",
         | 
| 724 | 
             
                                        "Spanish (es)",
         | 
| 725 | 
             
                                        "English (en)",
         | 
| 726 | 
             
                                        1,
         | 
|  | |
| 757 | 
             
                                AUDIO_MIX,
         | 
| 758 | 
             
                                ],
         | 
| 759 | 
             
                                outputs=[video_output],
         | 
| 760 | 
            +
                                cache_examples=False,
         | 
| 761 | 
             
                            )
         | 
| 762 |  | 
| 763 | 
             
            ### link
         | 
| 764 |  | 
| 765 | 
            +
                with gr.Tab("Audio Translation via Video Link"):
         | 
| 766 | 
             
                    with gr.Row():
         | 
| 767 | 
             
                        with gr.Column():
         | 
| 768 |  | 
| 769 | 
             
                            blink_input = gr.Textbox(label="Media link.", info="Example: www.youtube.com/watch?v=g_9rPvbENUw", placeholder="URL goes here...")
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 770 |  | 
| 771 | 
            +
                            bSOURCE_LANGUAGE = gr.Dropdown(['Automatic detection', 'Arabic (ar)', 'Chinese (zh)', 'Czech (cs)', 'Danish (da)', 'Dutch (nl)', 'English (en)', 'Finnish (fi)', 'French (fr)', 'German (de)', 'Greek (el)', 'Hebrew (he)', 'Hindi (hi)', 'Hungarian (hu)', 'Italian (it)', 'Japanese (ja)', 'Korean (ko)', 'Persian (fa)', 'Polish (pl)', 'Portuguese (pt)', 'Russian (ru)', 'Spanish (es)', 'Turkish (tr)', 'Ukrainian (uk)', 'Urdu (ur)', 'Vietnamese (vi)'], value='Automatic detection',label = 'Source language', info="This is the original language of the video")
         | 
| 772 | 
            +
                            bTRANSLATE_AUDIO_TO = gr.Dropdown(['Arabic (ar)', 'Chinese (zh)', 'Czech (cs)', 'Danish (da)', 'Dutch (nl)', 'English (en)', 'Finnish (fi)', 'French (fr)', 'German (de)', 'Greek (el)', 'Hebrew (he)', 'Hindi (hi)', 'Hungarian (hu)', 'Italian (it)', 'Japanese (ja)', 'Korean (ko)', 'Persian (fa)', 'Polish (pl)', 'Portuguese (pt)', 'Russian (ru)', 'Spanish (es)', 'Turkish (tr)', 'Ukrainian (uk)', 'Urdu (ur)', 'Vietnamese (vi)'], value='English (en)',label = 'Translate audio to', info="Select the target language, and make sure to select the language corresponding to the speakers of the target language to avoid errors in the process.")
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 773 |  | 
| 774 | 
             
                            bline_ = gr.HTML("<hr></h2>")
         | 
| 775 | 
             
                            gr.Markdown("Select how many people are speaking in the video.")
         | 
|  | |
| 792 |  | 
| 793 | 
             
                            with gr.Column():
         | 
| 794 | 
             
                                  with gr.Accordion("Advanced Settings", open=False):
         | 
| 795 | 
            +
             | 
| 796 | 
             
                                      bAUDIO_MIX = gr.Dropdown(['Mixing audio with sidechain compression', 'Adjusting volumes and mixing audio'], value='Adjusting volumes and mixing audio', label = 'Audio Mixing Method', info="Mix original and translated audio files to create a customized, balanced output with two available mixing modes.")
         | 
| 797 |  | 
| 798 | 
             
                                      gr.HTML("<hr></h2>")
         | 
|  | |
| 805 | 
             
                                      bVIDEO_OUTPUT_NAME = gr.Textbox(label="Translated file name" ,value="video_output.mp4", info="The name of the output file")
         | 
| 806 | 
             
                                      bPREVIEW = gr.Checkbox(label="Preview", info="Preview cuts the video to only 10 seconds for testing purposes. Please deactivate it to retrieve the full video duration.")
         | 
| 807 |  | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 808 | 
             
                        with gr.Column(variant='compact'):
         | 
| 809 | 
             
                            with gr.Row():
         | 
| 810 | 
             
                                text_button = gr.Button("TRANSLATE")
         | 
| 811 | 
             
                            with gr.Row():
         | 
| 812 | 
            +
                                blink_output = gr.outputs.File(label="DOWNLOAD TRANSLATED VIDEO") # gr.Video()
         | 
| 813 |  | 
| 814 |  | 
| 815 | 
             
                            bline_ = gr.HTML("<hr></h2>")
         | 
|  | |
| 823 | 
             
                                    [
         | 
| 824 | 
             
                                        "https://www.youtube.com/watch?v=5ZeHtRKHl7Y",
         | 
| 825 | 
             
                                        "",
         | 
| 826 | 
            +
                                        False,
         | 
| 827 | 
            +
                                        "large-v2",
         | 
| 828 | 
             
                                        16,
         | 
| 829 | 
            +
                                        "float16",
         | 
| 830 | 
             
                                        "Japanese (ja)",
         | 
| 831 | 
             
                                        "English (en)",
         | 
| 832 | 
             
                                        1,
         | 
|  | |
| 863 | 
             
                                bAUDIO_MIX
         | 
| 864 | 
             
                                ],
         | 
| 865 | 
             
                                outputs=[blink_output],
         | 
| 866 | 
            +
                                cache_examples=False,
         | 
| 867 | 
             
                            )
         | 
| 868 |  | 
| 869 |  | 
| 870 | 
            +
                with gr.Tab("Custom voice RVC"):
         | 
| 871 | 
            +
                    with gr.Column():
         | 
| 872 | 
            +
                      with gr.Accordion("Download RVC Models", open=True):
         | 
| 873 | 
            +
                        url_links = gr.Textbox(label="URLs", value="",info="Automatically download the RVC models from the URL. You can use links from HuggingFace or Drive, and you can include several links, each one separated by a comma.", placeholder="urls here...", lines=1)
         | 
| 874 | 
            +
                        download_finish = gr.HTML()
         | 
| 875 | 
            +
                        download_button = gr.Button("DOWNLOAD MODELS")
         | 
| 876 | 
            +
             | 
| 877 | 
            +
                        def update_models():
         | 
| 878 | 
            +
                          models, index_paths = upload_model_list()
         | 
| 879 | 
            +
                          for i in range(8):                      
         | 
| 880 | 
            +
                            dict_models = {
         | 
| 881 | 
            +
                                f'model_voice_path{i:02d}': gr.update(choices=models) for i in range(8)
         | 
| 882 | 
            +
                            }
         | 
| 883 | 
            +
                            dict_index = {
         | 
| 884 | 
            +
                                f'file_index2_{i:02d}': gr.update(choices=index_paths) for i in range(8)
         | 
| 885 | 
            +
                            }
         | 
| 886 | 
            +
                            dict_changes = {**dict_models, **dict_index}
         | 
| 887 | 
            +
                            return [value for value in dict_changes.values()]
         | 
| 888 | 
            +
             | 
| 889 | 
            +
                    with gr.Column():
         | 
| 890 | 
            +
                      with gr.Accordion("Replace voice: TTS to RVC", open=False):
         | 
| 891 | 
            +
                        with gr.Column(variant='compact'):
         | 
| 892 | 
            +
                          with gr.Column():
         | 
| 893 | 
            +
                            gr.Markdown("### 1. To enable its use, mark it as enable.")
         | 
| 894 | 
            +
                            enable_custom_voice = gr.Checkbox(label="ENABLE", info="Check this to enable the use of the models.")
         | 
| 895 | 
            +
                            enable_custom_voice.change(custom_model_voice_enable, [enable_custom_voice], [])
         | 
| 896 | 
            +
             | 
| 897 | 
            +
                            gr.Markdown("### 2. Select a voice that will be applied to each TTS of each corresponding speaker and apply the configurations.")
         | 
| 898 | 
            +
                            
         | 
| 899 | 
            +
                            gr.Markdown("Voice to apply to the first speaker.")
         | 
| 900 | 
            +
                            with gr.Row():
         | 
| 901 | 
            +
                              model_voice_path00 = gr.Dropdown(models, label = 'Model-1', visible=True, interactive= True)
         | 
| 902 | 
            +
                              file_index2_00 = gr.Dropdown(index_paths, label = 'Index-1', visible=True, interactive= True)
         | 
| 903 | 
            +
                              name_transpose00 = gr.Number(label = 'Transpose-1', value=0, visible=True, interactive= True)
         | 
| 904 | 
            +
                            gr.HTML("<hr></h2>")
         | 
| 905 | 
            +
                            gr.Markdown("Voice to apply to the second speaker.")
         | 
| 906 | 
            +
                            with gr.Row():
         | 
| 907 | 
            +
                              model_voice_path01 = gr.Dropdown(models, label='Model-2', visible=True, interactive=True)
         | 
| 908 | 
            +
                              file_index2_01 = gr.Dropdown(index_paths, label='Index-2', visible=True, interactive=True)
         | 
| 909 | 
            +
                              name_transpose01 = gr.Number(label='Transpose-2', value=0, visible=True, interactive=True)
         | 
| 910 | 
            +
                            gr.HTML("<hr></h2>")
         | 
| 911 | 
            +
                            gr.Markdown("Voice to apply to the third speaker.")
         | 
| 912 | 
            +
                            with gr.Row():
         | 
| 913 | 
            +
                              model_voice_path02 = gr.Dropdown(models, label='Model-3', visible=True, interactive=True)
         | 
| 914 | 
            +
                              file_index2_02 = gr.Dropdown(index_paths, label='Index-3', visible=True, interactive=True)
         | 
| 915 | 
            +
                              name_transpose02 = gr.Number(label='Transpose-3', value=0, visible=True, interactive=True)
         | 
| 916 | 
            +
                            gr.HTML("<hr></h2>")
         | 
| 917 | 
            +
                            gr.Markdown("Voice to apply to the fourth speaker.")
         | 
| 918 | 
            +
                            with gr.Row():
         | 
| 919 | 
            +
                              model_voice_path03 = gr.Dropdown(models, label='Model-4', visible=True, interactive=True)
         | 
| 920 | 
            +
                              file_index2_03 = gr.Dropdown(index_paths, label='Index-4', visible=True, interactive=True)
         | 
| 921 | 
            +
                              name_transpose03 = gr.Number(label='Transpose-4', value=0, visible=True, interactive=True)
         | 
| 922 | 
            +
                            gr.HTML("<hr></h2>")
         | 
| 923 | 
            +
                            gr.Markdown("Voice to apply to the fifth speaker.")
         | 
| 924 | 
            +
                            with gr.Row():
         | 
| 925 | 
            +
                              model_voice_path04 = gr.Dropdown(models, label='Model-5', visible=True, interactive=True)
         | 
| 926 | 
            +
                              file_index2_04 = gr.Dropdown(index_paths, label='Index-5', visible=True, interactive=True)
         | 
| 927 | 
            +
                              name_transpose04 = gr.Number(label='Transpose-5', value=0, visible=True, interactive=True)
         | 
| 928 | 
            +
                            gr.HTML("<hr></h2>")
         | 
| 929 | 
            +
                            gr.Markdown("Voice to apply to the sixth speaker.")
         | 
| 930 | 
            +
                            with gr.Row():
         | 
| 931 | 
            +
                              model_voice_path05 = gr.Dropdown(models, label='Model-6', visible=True, interactive=True)
         | 
| 932 | 
            +
                              file_index2_05 = gr.Dropdown(index_paths, label='Index-6', visible=True, interactive=True)
         | 
| 933 | 
            +
                              name_transpose05 = gr.Number(label='Transpose-6', value=0, visible=True, interactive=True)
         | 
| 934 | 
            +
                            gr.HTML("<hr></h2>")
         | 
| 935 | 
            +
                            gr.Markdown("- Voice to apply in case a speaker is not detected successfully.")
         | 
| 936 | 
            +
                            with gr.Row():
         | 
| 937 | 
            +
                              model_voice_path06 = gr.Dropdown(models, label='Model-Aux', visible=True, interactive=True)
         | 
| 938 | 
            +
                              file_index2_06 = gr.Dropdown(index_paths, label='Index-Aux', visible=True, interactive=True)
         | 
| 939 | 
            +
                              name_transpose06 = gr.Number(label='Transpose-Aux', value=0, visible=True, interactive=True)
         | 
| 940 | 
            +
                            gr.HTML("<hr></h2>")
         | 
| 941 | 
            +
                            with gr.Row():
         | 
| 942 | 
            +
                              f0_method_global = gr.Dropdown(f0_methods_voice, value='pm', label = 'Global F0 method', visible=True, interactive= True)
         | 
| 943 | 
            +
             | 
| 944 | 
            +
                        with gr.Row(variant='compact'):
         | 
| 945 | 
            +
                          button_config = gr.Button("APPLY CONFIGURATION")
         | 
| 946 | 
            +
             | 
| 947 | 
            +
                          confirm_conf = gr.HTML()
         | 
| 948 | 
            +
             | 
| 949 | 
            +
                        button_config.click(voices.apply_conf, inputs=[
         | 
| 950 | 
            +
                            f0_method_global,
         | 
| 951 | 
            +
                            model_voice_path00, name_transpose00, file_index2_00,
         | 
| 952 | 
            +
                            model_voice_path01, name_transpose01, file_index2_01,
         | 
| 953 | 
            +
                            model_voice_path02, name_transpose02, file_index2_02,
         | 
| 954 | 
            +
                            model_voice_path03, name_transpose03, file_index2_03,
         | 
| 955 | 
            +
                            model_voice_path04, name_transpose04, file_index2_04,
         | 
| 956 | 
            +
                            model_voice_path05, name_transpose05, file_index2_05,
         | 
| 957 | 
            +
                            model_voice_path06, name_transpose06, file_index2_06,
         | 
| 958 | 
            +
                            ], outputs=[confirm_conf])
         | 
| 959 | 
            +
             | 
| 960 | 
            +
             | 
| 961 | 
            +
                      with gr.Column():
         | 
| 962 | 
            +
                            with gr.Accordion("Test RVC", open=False):
         | 
| 963 | 
            +
             | 
| 964 | 
            +
                              with gr.Row(variant='compact'):
         | 
| 965 | 
            +
                                text_test = gr.Textbox(label="Text", value="This is an example",info="write a text", placeholder="...", lines=5)
         | 
| 966 | 
            +
                                with gr.Column(): 
         | 
| 967 | 
            +
                                  tts_test = gr.Dropdown(list_tts, value='en-GB-ThomasNeural-Male', label = 'TTS', visible=True, interactive= True)
         | 
| 968 | 
            +
                                  model_voice_path07 = gr.Dropdown(models, label = 'Model', visible=True, interactive= True) #value=''
         | 
| 969 | 
            +
                                  file_index2_07 = gr.Dropdown(index_paths, label = 'Index', visible=True, interactive= True) #value=''
         | 
| 970 | 
            +
                                  transpose_test = gr.Number(label = 'Transpose', value=0, visible=True, interactive= True, info="integer, number of semitones, raise by an octave: 12, lower by an octave: -12")
         | 
| 971 | 
            +
                                  f0method_test = gr.Dropdown(f0_methods_voice, value='pm', label = 'F0 method', visible=True, interactive= True) 
         | 
| 972 | 
            +
                              with gr.Row(variant='compact'):
         | 
| 973 | 
            +
                                button_test = gr.Button("Test audio")
         | 
| 974 | 
            +
             | 
| 975 | 
            +
                              with gr.Column():
         | 
| 976 | 
            +
                                with gr.Row():
         | 
| 977 | 
            +
                                  original_ttsvoice = gr.Audio()
         | 
| 978 | 
            +
                                  ttsvoice = gr.Audio()
         | 
| 979 | 
            +
             | 
| 980 | 
            +
                                button_test.click(voices.make_test, inputs=[
         | 
| 981 | 
            +
                                    text_test,
         | 
| 982 | 
            +
                                    tts_test,
         | 
| 983 | 
            +
                                    model_voice_path07,
         | 
| 984 | 
            +
                                    file_index2_07,
         | 
| 985 | 
            +
                                    transpose_test,
         | 
| 986 | 
            +
                                    f0method_test,
         | 
| 987 | 
            +
                                    ], outputs=[ttsvoice, original_ttsvoice])
         | 
| 988 | 
            +
             | 
| 989 | 
            +
                            download_button.click(download_list, [url_links], [download_finish]).then(update_models, [], 
         | 
| 990 | 
            +
                                              [
         | 
| 991 | 
            +
                                                model_voice_path00, model_voice_path01, model_voice_path02, model_voice_path03, model_voice_path04, model_voice_path05, model_voice_path06, model_voice_path07,
         | 
| 992 | 
            +
                                                file_index2_00, file_index2_01, file_index2_02, file_index2_03, file_index2_04, file_index2_05, file_index2_06, file_index2_07
         | 
| 993 | 
            +
                                              ])
         | 
| 994 |  | 
| 995 |  | 
| 996 | 
             
                with gr.Tab("Help"):
         | 
|  | |
| 997 | 
             
                    gr.Markdown(tutorial)
         | 
| 998 | 
            +
                    gr.Markdown(news)
         | 
| 999 |  | 
| 1000 | 
             
                with gr.Accordion("Logs", open = False):
         | 
| 1001 | 
             
                    logs = gr.Textbox()
         | 
|  | |
| 1043 | 
             
                    bAUDIO_MIX,
         | 
| 1044 | 
             
                    ], outputs=blink_output)
         | 
| 1045 |  | 
| 1046 | 
            +
            #demo.launch(debug=True, enable_queue=True)
         | 
| 1047 | 
            +
            demo.launch(share=True, enable_queue=True, quiet=True, debug=False)
         | 
    	
        configs/32k.json
    ADDED
    
    | @@ -0,0 +1,46 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            {
         | 
| 2 | 
            +
              "train": {
         | 
| 3 | 
            +
                "log_interval": 200,
         | 
| 4 | 
            +
                "seed": 1234,
         | 
| 5 | 
            +
                "epochs": 20000,
         | 
| 6 | 
            +
                "learning_rate": 1e-4,
         | 
| 7 | 
            +
                "betas": [0.8, 0.99],
         | 
| 8 | 
            +
                "eps": 1e-9,
         | 
| 9 | 
            +
                "batch_size": 4,
         | 
| 10 | 
            +
                "fp16_run": false,
         | 
| 11 | 
            +
                "lr_decay": 0.999875,
         | 
| 12 | 
            +
                "segment_size": 12800,
         | 
| 13 | 
            +
                "init_lr_ratio": 1,
         | 
| 14 | 
            +
                "warmup_epochs": 0,
         | 
| 15 | 
            +
                "c_mel": 45,
         | 
| 16 | 
            +
                "c_kl": 1.0
         | 
| 17 | 
            +
              },
         | 
| 18 | 
            +
              "data": {
         | 
| 19 | 
            +
                "max_wav_value": 32768.0,
         | 
| 20 | 
            +
                "sampling_rate": 32000,
         | 
| 21 | 
            +
                "filter_length": 1024,
         | 
| 22 | 
            +
                "hop_length": 320,
         | 
| 23 | 
            +
                "win_length": 1024,
         | 
| 24 | 
            +
                "n_mel_channels": 80,
         | 
| 25 | 
            +
                "mel_fmin": 0.0,
         | 
| 26 | 
            +
                "mel_fmax": null
         | 
| 27 | 
            +
              },
         | 
| 28 | 
            +
              "model": {
         | 
| 29 | 
            +
                "inter_channels": 192,
         | 
| 30 | 
            +
                "hidden_channels": 192,
         | 
| 31 | 
            +
                "filter_channels": 768,
         | 
| 32 | 
            +
                "n_heads": 2,
         | 
| 33 | 
            +
                "n_layers": 6,
         | 
| 34 | 
            +
                "kernel_size": 3,
         | 
| 35 | 
            +
                "p_dropout": 0,
         | 
| 36 | 
            +
                "resblock": "1",
         | 
| 37 | 
            +
                "resblock_kernel_sizes": [3,7,11],
         | 
| 38 | 
            +
                "resblock_dilation_sizes": [[1,3,5], [1,3,5], [1,3,5]],
         | 
| 39 | 
            +
                "upsample_rates": [10,4,2,2,2],
         | 
| 40 | 
            +
                "upsample_initial_channel": 512,
         | 
| 41 | 
            +
                "upsample_kernel_sizes": [16,16,4,4,4],
         | 
| 42 | 
            +
                "use_spectral_norm": false,
         | 
| 43 | 
            +
                "gin_channels": 256,
         | 
| 44 | 
            +
                "spk_embed_dim": 109
         | 
| 45 | 
            +
              }
         | 
| 46 | 
            +
            }
         | 
    	
        configs/32k_v2.json
    ADDED
    
    | @@ -0,0 +1,46 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            {
         | 
| 2 | 
            +
              "train": {
         | 
| 3 | 
            +
                "log_interval": 200,
         | 
| 4 | 
            +
                "seed": 1234,
         | 
| 5 | 
            +
                "epochs": 20000,
         | 
| 6 | 
            +
                "learning_rate": 1e-4,
         | 
| 7 | 
            +
                "betas": [0.8, 0.99],
         | 
| 8 | 
            +
                "eps": 1e-9,
         | 
| 9 | 
            +
                "batch_size": 4,
         | 
| 10 | 
            +
                "fp16_run": false,
         | 
| 11 | 
            +
                "lr_decay": 0.999875,
         | 
| 12 | 
            +
                "segment_size": 12800,
         | 
| 13 | 
            +
                "init_lr_ratio": 1,
         | 
| 14 | 
            +
                "warmup_epochs": 0,
         | 
| 15 | 
            +
                "c_mel": 45,
         | 
| 16 | 
            +
                "c_kl": 1.0
         | 
| 17 | 
            +
              },
         | 
| 18 | 
            +
              "data": {
         | 
| 19 | 
            +
                "max_wav_value": 32768.0,
         | 
| 20 | 
            +
                "sampling_rate": 32000,
         | 
| 21 | 
            +
                "filter_length": 1024,
         | 
| 22 | 
            +
                "hop_length": 320,
         | 
| 23 | 
            +
                "win_length": 1024,
         | 
| 24 | 
            +
                "n_mel_channels": 80,
         | 
| 25 | 
            +
                "mel_fmin": 0.0,
         | 
| 26 | 
            +
                "mel_fmax": null
         | 
| 27 | 
            +
              },
         | 
| 28 | 
            +
              "model": {
         | 
| 29 | 
            +
                "inter_channels": 192,
         | 
| 30 | 
            +
                "hidden_channels": 192,
         | 
| 31 | 
            +
                "filter_channels": 768,
         | 
| 32 | 
            +
                "n_heads": 2,
         | 
| 33 | 
            +
                "n_layers": 6,
         | 
| 34 | 
            +
                "kernel_size": 3,
         | 
| 35 | 
            +
                "p_dropout": 0,
         | 
| 36 | 
            +
                "resblock": "1",
         | 
| 37 | 
            +
                "resblock_kernel_sizes": [3,7,11],
         | 
| 38 | 
            +
                "resblock_dilation_sizes": [[1,3,5], [1,3,5], [1,3,5]],
         | 
| 39 | 
            +
                "upsample_rates": [10,8,2,2],
         | 
| 40 | 
            +
                "upsample_initial_channel": 512,
         | 
| 41 | 
            +
                "upsample_kernel_sizes": [20,16,4,4],
         | 
| 42 | 
            +
                "use_spectral_norm": false,
         | 
| 43 | 
            +
                "gin_channels": 256,
         | 
| 44 | 
            +
                "spk_embed_dim": 109
         | 
| 45 | 
            +
              }
         | 
| 46 | 
            +
            }
         | 
    	
        configs/40k.json
    ADDED
    
    | @@ -0,0 +1,46 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            {
         | 
| 2 | 
            +
              "train": {
         | 
| 3 | 
            +
                "log_interval": 200,
         | 
| 4 | 
            +
                "seed": 1234,
         | 
| 5 | 
            +
                "epochs": 20000,
         | 
| 6 | 
            +
                "learning_rate": 1e-4,
         | 
| 7 | 
            +
                "betas": [0.8, 0.99],
         | 
| 8 | 
            +
                "eps": 1e-9,
         | 
| 9 | 
            +
                "batch_size": 4,
         | 
| 10 | 
            +
                "fp16_run": false,
         | 
| 11 | 
            +
                "lr_decay": 0.999875,
         | 
| 12 | 
            +
                "segment_size": 12800,
         | 
| 13 | 
            +
                "init_lr_ratio": 1,
         | 
| 14 | 
            +
                "warmup_epochs": 0,
         | 
| 15 | 
            +
                "c_mel": 45,
         | 
| 16 | 
            +
                "c_kl": 1.0
         | 
| 17 | 
            +
              },
         | 
| 18 | 
            +
              "data": {
         | 
| 19 | 
            +
                "max_wav_value": 32768.0,
         | 
| 20 | 
            +
                "sampling_rate": 40000,
         | 
| 21 | 
            +
                "filter_length": 2048,
         | 
| 22 | 
            +
                "hop_length": 400,
         | 
| 23 | 
            +
                "win_length": 2048,
         | 
| 24 | 
            +
                "n_mel_channels": 125,
         | 
| 25 | 
            +
                "mel_fmin": 0.0,
         | 
| 26 | 
            +
                "mel_fmax": null
         | 
| 27 | 
            +
              },
         | 
| 28 | 
            +
              "model": {
         | 
| 29 | 
            +
                "inter_channels": 192,
         | 
| 30 | 
            +
                "hidden_channels": 192,
         | 
| 31 | 
            +
                "filter_channels": 768,
         | 
| 32 | 
            +
                "n_heads": 2,
         | 
| 33 | 
            +
                "n_layers": 6,
         | 
| 34 | 
            +
                "kernel_size": 3,
         | 
| 35 | 
            +
                "p_dropout": 0,
         | 
| 36 | 
            +
                "resblock": "1",
         | 
| 37 | 
            +
                "resblock_kernel_sizes": [3,7,11],
         | 
| 38 | 
            +
                "resblock_dilation_sizes": [[1,3,5], [1,3,5], [1,3,5]],
         | 
| 39 | 
            +
                "upsample_rates": [10,10,2,2],
         | 
| 40 | 
            +
                "upsample_initial_channel": 512,
         | 
| 41 | 
            +
                "upsample_kernel_sizes": [16,16,4,4],
         | 
| 42 | 
            +
                "use_spectral_norm": false,
         | 
| 43 | 
            +
                "gin_channels": 256,
         | 
| 44 | 
            +
                "spk_embed_dim": 109
         | 
| 45 | 
            +
              }
         | 
| 46 | 
            +
            }
         | 
    	
        configs/48k.json
    ADDED
    
    | @@ -0,0 +1,46 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            {
         | 
| 2 | 
            +
              "train": {
         | 
| 3 | 
            +
                "log_interval": 200,
         | 
| 4 | 
            +
                "seed": 1234,
         | 
| 5 | 
            +
                "epochs": 20000,
         | 
| 6 | 
            +
                "learning_rate": 1e-4,
         | 
| 7 | 
            +
                "betas": [0.8, 0.99],
         | 
| 8 | 
            +
                "eps": 1e-9,
         | 
| 9 | 
            +
                "batch_size": 4,
         | 
| 10 | 
            +
                "fp16_run": false,
         | 
| 11 | 
            +
                "lr_decay": 0.999875,
         | 
| 12 | 
            +
                "segment_size": 11520,
         | 
| 13 | 
            +
                "init_lr_ratio": 1,
         | 
| 14 | 
            +
                "warmup_epochs": 0,
         | 
| 15 | 
            +
                "c_mel": 45,
         | 
| 16 | 
            +
                "c_kl": 1.0
         | 
| 17 | 
            +
              },
         | 
| 18 | 
            +
              "data": {
         | 
| 19 | 
            +
                "max_wav_value": 32768.0,
         | 
| 20 | 
            +
                "sampling_rate": 48000,
         | 
| 21 | 
            +
                "filter_length": 2048,
         | 
| 22 | 
            +
                "hop_length": 480,
         | 
| 23 | 
            +
                "win_length": 2048,
         | 
| 24 | 
            +
                "n_mel_channels": 128,
         | 
| 25 | 
            +
                "mel_fmin": 0.0,
         | 
| 26 | 
            +
                "mel_fmax": null
         | 
| 27 | 
            +
              },
         | 
| 28 | 
            +
              "model": {
         | 
| 29 | 
            +
                "inter_channels": 192,
         | 
| 30 | 
            +
                "hidden_channels": 192,
         | 
| 31 | 
            +
                "filter_channels": 768,
         | 
| 32 | 
            +
                "n_heads": 2,
         | 
| 33 | 
            +
                "n_layers": 6,
         | 
| 34 | 
            +
                "kernel_size": 3,
         | 
| 35 | 
            +
                "p_dropout": 0,
         | 
| 36 | 
            +
                "resblock": "1",
         | 
| 37 | 
            +
                "resblock_kernel_sizes": [3,7,11],
         | 
| 38 | 
            +
                "resblock_dilation_sizes": [[1,3,5], [1,3,5], [1,3,5]],
         | 
| 39 | 
            +
                "upsample_rates": [10,6,2,2,2],
         | 
| 40 | 
            +
                "upsample_initial_channel": 512,
         | 
| 41 | 
            +
                "upsample_kernel_sizes": [16,16,4,4,4],
         | 
| 42 | 
            +
                "use_spectral_norm": false,
         | 
| 43 | 
            +
                "gin_channels": 256,
         | 
| 44 | 
            +
                "spk_embed_dim": 109
         | 
| 45 | 
            +
              }
         | 
| 46 | 
            +
            }
         | 
    	
        configs/48k_v2.json
    ADDED
    
    | @@ -0,0 +1,46 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            {
         | 
| 2 | 
            +
              "train": {
         | 
| 3 | 
            +
                "log_interval": 200,
         | 
| 4 | 
            +
                "seed": 1234,
         | 
| 5 | 
            +
                "epochs": 20000,
         | 
| 6 | 
            +
                "learning_rate": 1e-4,
         | 
| 7 | 
            +
                "betas": [0.8, 0.99],
         | 
| 8 | 
            +
                "eps": 1e-9,
         | 
| 9 | 
            +
                "batch_size": 4,
         | 
| 10 | 
            +
                "fp16_run": false,
         | 
| 11 | 
            +
                "lr_decay": 0.999875,
         | 
| 12 | 
            +
                "segment_size": 17280,
         | 
| 13 | 
            +
                "init_lr_ratio": 1,
         | 
| 14 | 
            +
                "warmup_epochs": 0,
         | 
| 15 | 
            +
                "c_mel": 45,
         | 
| 16 | 
            +
                "c_kl": 1.0
         | 
| 17 | 
            +
              },
         | 
| 18 | 
            +
              "data": {
         | 
| 19 | 
            +
                "max_wav_value": 32768.0,
         | 
| 20 | 
            +
                "sampling_rate": 48000,
         | 
| 21 | 
            +
                "filter_length": 2048,
         | 
| 22 | 
            +
                "hop_length": 480,
         | 
| 23 | 
            +
                "win_length": 2048,
         | 
| 24 | 
            +
                "n_mel_channels": 128,
         | 
| 25 | 
            +
                "mel_fmin": 0.0,
         | 
| 26 | 
            +
                "mel_fmax": null
         | 
| 27 | 
            +
              },
         | 
| 28 | 
            +
              "model": {
         | 
| 29 | 
            +
                "inter_channels": 192,
         | 
| 30 | 
            +
                "hidden_channels": 192,
         | 
| 31 | 
            +
                "filter_channels": 768,
         | 
| 32 | 
            +
                "n_heads": 2,
         | 
| 33 | 
            +
                "n_layers": 6,
         | 
| 34 | 
            +
                "kernel_size": 3,
         | 
| 35 | 
            +
                "p_dropout": 0,
         | 
| 36 | 
            +
                "resblock": "1",
         | 
| 37 | 
            +
                "resblock_kernel_sizes": [3,7,11],
         | 
| 38 | 
            +
                "resblock_dilation_sizes": [[1,3,5], [1,3,5], [1,3,5]],
         | 
| 39 | 
            +
                "upsample_rates": [12,10,2,2],
         | 
| 40 | 
            +
                "upsample_initial_channel": 512,
         | 
| 41 | 
            +
                "upsample_kernel_sizes": [24,20,4,4],
         | 
| 42 | 
            +
                "use_spectral_norm": false,
         | 
| 43 | 
            +
                "gin_channels": 256,
         | 
| 44 | 
            +
                "spk_embed_dim": 109
         | 
| 45 | 
            +
              }
         | 
| 46 | 
            +
            }
         | 
    	
        lib/audio.py
    ADDED
    
    | @@ -0,0 +1,21 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            import ffmpeg
         | 
| 2 | 
            +
            import numpy as np
         | 
| 3 | 
            +
             | 
| 4 | 
            +
             | 
| 5 | 
            +
            def load_audio(file, sr):
         | 
| 6 | 
            +
                try:
         | 
| 7 | 
            +
                    # https://github.com/openai/whisper/blob/main/whisper/audio.py#L26
         | 
| 8 | 
            +
                    # This launches a subprocess to decode audio while down-mixing and resampling as necessary.
         | 
| 9 | 
            +
                    # Requires the ffmpeg CLI and `ffmpeg-python` package to be installed.
         | 
| 10 | 
            +
                    file = (
         | 
| 11 | 
            +
                        file.strip(" ").strip('"').strip("\n").strip('"').strip(" ")
         | 
| 12 | 
            +
                    )  # To prevent beginners from copying paths with leading or trailing spaces, quotation marks, and line breaks.
         | 
| 13 | 
            +
                    out, _ = (
         | 
| 14 | 
            +
                        ffmpeg.input(file, threads=0)
         | 
| 15 | 
            +
                        .output("-", format="f32le", acodec="pcm_f32le", ac=1, ar=sr)
         | 
| 16 | 
            +
                        .run(cmd=["ffmpeg", "-nostdin"], capture_stdout=True, capture_stderr=True)
         | 
| 17 | 
            +
                    )
         | 
| 18 | 
            +
                except Exception as e:
         | 
| 19 | 
            +
                    raise RuntimeError(f"Failed to load audio: {e}")
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                return np.frombuffer(out, np.float32).flatten()
         | 
    	
        lib/infer_pack/attentions.py
    ADDED
    
    | @@ -0,0 +1,417 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            import copy
         | 
| 2 | 
            +
            import math
         | 
| 3 | 
            +
            import numpy as np
         | 
| 4 | 
            +
            import torch
         | 
| 5 | 
            +
            from torch import nn
         | 
| 6 | 
            +
            from torch.nn import functional as F
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            from lib.infer_pack import commons
         | 
| 9 | 
            +
            from lib.infer_pack import modules
         | 
| 10 | 
            +
            from lib.infer_pack.modules import LayerNorm
         | 
| 11 | 
            +
             | 
| 12 | 
            +
             | 
| 13 | 
            +
            class Encoder(nn.Module):
         | 
| 14 | 
            +
                def __init__(
         | 
| 15 | 
            +
                    self,
         | 
| 16 | 
            +
                    hidden_channels,
         | 
| 17 | 
            +
                    filter_channels,
         | 
| 18 | 
            +
                    n_heads,
         | 
| 19 | 
            +
                    n_layers,
         | 
| 20 | 
            +
                    kernel_size=1,
         | 
| 21 | 
            +
                    p_dropout=0.0,
         | 
| 22 | 
            +
                    window_size=10,
         | 
| 23 | 
            +
                    **kwargs
         | 
| 24 | 
            +
                ):
         | 
| 25 | 
            +
                    super().__init__()
         | 
| 26 | 
            +
                    self.hidden_channels = hidden_channels
         | 
| 27 | 
            +
                    self.filter_channels = filter_channels
         | 
| 28 | 
            +
                    self.n_heads = n_heads
         | 
| 29 | 
            +
                    self.n_layers = n_layers
         | 
| 30 | 
            +
                    self.kernel_size = kernel_size
         | 
| 31 | 
            +
                    self.p_dropout = p_dropout
         | 
| 32 | 
            +
                    self.window_size = window_size
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                    self.drop = nn.Dropout(p_dropout)
         | 
| 35 | 
            +
                    self.attn_layers = nn.ModuleList()
         | 
| 36 | 
            +
                    self.norm_layers_1 = nn.ModuleList()
         | 
| 37 | 
            +
                    self.ffn_layers = nn.ModuleList()
         | 
| 38 | 
            +
                    self.norm_layers_2 = nn.ModuleList()
         | 
| 39 | 
            +
                    for i in range(self.n_layers):
         | 
| 40 | 
            +
                        self.attn_layers.append(
         | 
| 41 | 
            +
                            MultiHeadAttention(
         | 
| 42 | 
            +
                                hidden_channels,
         | 
| 43 | 
            +
                                hidden_channels,
         | 
| 44 | 
            +
                                n_heads,
         | 
| 45 | 
            +
                                p_dropout=p_dropout,
         | 
| 46 | 
            +
                                window_size=window_size,
         | 
| 47 | 
            +
                            )
         | 
| 48 | 
            +
                        )
         | 
| 49 | 
            +
                        self.norm_layers_1.append(LayerNorm(hidden_channels))
         | 
| 50 | 
            +
                        self.ffn_layers.append(
         | 
| 51 | 
            +
                            FFN(
         | 
| 52 | 
            +
                                hidden_channels,
         | 
| 53 | 
            +
                                hidden_channels,
         | 
| 54 | 
            +
                                filter_channels,
         | 
| 55 | 
            +
                                kernel_size,
         | 
| 56 | 
            +
                                p_dropout=p_dropout,
         | 
| 57 | 
            +
                            )
         | 
| 58 | 
            +
                        )
         | 
| 59 | 
            +
                        self.norm_layers_2.append(LayerNorm(hidden_channels))
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                def forward(self, x, x_mask):
         | 
| 62 | 
            +
                    attn_mask = x_mask.unsqueeze(2) * x_mask.unsqueeze(-1)
         | 
| 63 | 
            +
                    x = x * x_mask
         | 
| 64 | 
            +
                    for i in range(self.n_layers):
         | 
| 65 | 
            +
                        y = self.attn_layers[i](x, x, attn_mask)
         | 
| 66 | 
            +
                        y = self.drop(y)
         | 
| 67 | 
            +
                        x = self.norm_layers_1[i](x + y)
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                        y = self.ffn_layers[i](x, x_mask)
         | 
| 70 | 
            +
                        y = self.drop(y)
         | 
| 71 | 
            +
                        x = self.norm_layers_2[i](x + y)
         | 
| 72 | 
            +
                    x = x * x_mask
         | 
| 73 | 
            +
                    return x
         | 
| 74 | 
            +
             | 
| 75 | 
            +
             | 
| 76 | 
            +
            class Decoder(nn.Module):
         | 
| 77 | 
            +
                def __init__(
         | 
| 78 | 
            +
                    self,
         | 
| 79 | 
            +
                    hidden_channels,
         | 
| 80 | 
            +
                    filter_channels,
         | 
| 81 | 
            +
                    n_heads,
         | 
| 82 | 
            +
                    n_layers,
         | 
| 83 | 
            +
                    kernel_size=1,
         | 
| 84 | 
            +
                    p_dropout=0.0,
         | 
| 85 | 
            +
                    proximal_bias=False,
         | 
| 86 | 
            +
                    proximal_init=True,
         | 
| 87 | 
            +
                    **kwargs
         | 
| 88 | 
            +
                ):
         | 
| 89 | 
            +
                    super().__init__()
         | 
| 90 | 
            +
                    self.hidden_channels = hidden_channels
         | 
| 91 | 
            +
                    self.filter_channels = filter_channels
         | 
| 92 | 
            +
                    self.n_heads = n_heads
         | 
| 93 | 
            +
                    self.n_layers = n_layers
         | 
| 94 | 
            +
                    self.kernel_size = kernel_size
         | 
| 95 | 
            +
                    self.p_dropout = p_dropout
         | 
| 96 | 
            +
                    self.proximal_bias = proximal_bias
         | 
| 97 | 
            +
                    self.proximal_init = proximal_init
         | 
| 98 | 
            +
             | 
| 99 | 
            +
                    self.drop = nn.Dropout(p_dropout)
         | 
| 100 | 
            +
                    self.self_attn_layers = nn.ModuleList()
         | 
| 101 | 
            +
                    self.norm_layers_0 = nn.ModuleList()
         | 
| 102 | 
            +
                    self.encdec_attn_layers = nn.ModuleList()
         | 
| 103 | 
            +
                    self.norm_layers_1 = nn.ModuleList()
         | 
| 104 | 
            +
                    self.ffn_layers = nn.ModuleList()
         | 
| 105 | 
            +
                    self.norm_layers_2 = nn.ModuleList()
         | 
| 106 | 
            +
                    for i in range(self.n_layers):
         | 
| 107 | 
            +
                        self.self_attn_layers.append(
         | 
| 108 | 
            +
                            MultiHeadAttention(
         | 
| 109 | 
            +
                                hidden_channels,
         | 
| 110 | 
            +
                                hidden_channels,
         | 
| 111 | 
            +
                                n_heads,
         | 
| 112 | 
            +
                                p_dropout=p_dropout,
         | 
| 113 | 
            +
                                proximal_bias=proximal_bias,
         | 
| 114 | 
            +
                                proximal_init=proximal_init,
         | 
| 115 | 
            +
                            )
         | 
| 116 | 
            +
                        )
         | 
| 117 | 
            +
                        self.norm_layers_0.append(LayerNorm(hidden_channels))
         | 
| 118 | 
            +
                        self.encdec_attn_layers.append(
         | 
| 119 | 
            +
                            MultiHeadAttention(
         | 
| 120 | 
            +
                                hidden_channels, hidden_channels, n_heads, p_dropout=p_dropout
         | 
| 121 | 
            +
                            )
         | 
| 122 | 
            +
                        )
         | 
| 123 | 
            +
                        self.norm_layers_1.append(LayerNorm(hidden_channels))
         | 
| 124 | 
            +
                        self.ffn_layers.append(
         | 
| 125 | 
            +
                            FFN(
         | 
| 126 | 
            +
                                hidden_channels,
         | 
| 127 | 
            +
                                hidden_channels,
         | 
| 128 | 
            +
                                filter_channels,
         | 
| 129 | 
            +
                                kernel_size,
         | 
| 130 | 
            +
                                p_dropout=p_dropout,
         | 
| 131 | 
            +
                                causal=True,
         | 
| 132 | 
            +
                            )
         | 
| 133 | 
            +
                        )
         | 
| 134 | 
            +
                        self.norm_layers_2.append(LayerNorm(hidden_channels))
         | 
| 135 | 
            +
             | 
| 136 | 
            +
                def forward(self, x, x_mask, h, h_mask):
         | 
| 137 | 
            +
                    """
         | 
| 138 | 
            +
                    x: decoder input
         | 
| 139 | 
            +
                    h: encoder output
         | 
| 140 | 
            +
                    """
         | 
| 141 | 
            +
                    self_attn_mask = commons.subsequent_mask(x_mask.size(2)).to(
         | 
| 142 | 
            +
                        device=x.device, dtype=x.dtype
         | 
| 143 | 
            +
                    )
         | 
| 144 | 
            +
                    encdec_attn_mask = h_mask.unsqueeze(2) * x_mask.unsqueeze(-1)
         | 
| 145 | 
            +
                    x = x * x_mask
         | 
| 146 | 
            +
                    for i in range(self.n_layers):
         | 
| 147 | 
            +
                        y = self.self_attn_layers[i](x, x, self_attn_mask)
         | 
| 148 | 
            +
                        y = self.drop(y)
         | 
| 149 | 
            +
                        x = self.norm_layers_0[i](x + y)
         | 
| 150 | 
            +
             | 
| 151 | 
            +
                        y = self.encdec_attn_layers[i](x, h, encdec_attn_mask)
         | 
| 152 | 
            +
                        y = self.drop(y)
         | 
| 153 | 
            +
                        x = self.norm_layers_1[i](x + y)
         | 
| 154 | 
            +
             | 
| 155 | 
            +
                        y = self.ffn_layers[i](x, x_mask)
         | 
| 156 | 
            +
                        y = self.drop(y)
         | 
| 157 | 
            +
                        x = self.norm_layers_2[i](x + y)
         | 
| 158 | 
            +
                    x = x * x_mask
         | 
| 159 | 
            +
                    return x
         | 
| 160 | 
            +
             | 
| 161 | 
            +
             | 
| 162 | 
            +
            class MultiHeadAttention(nn.Module):
         | 
| 163 | 
            +
                def __init__(
         | 
| 164 | 
            +
                    self,
         | 
| 165 | 
            +
                    channels,
         | 
| 166 | 
            +
                    out_channels,
         | 
| 167 | 
            +
                    n_heads,
         | 
| 168 | 
            +
                    p_dropout=0.0,
         | 
| 169 | 
            +
                    window_size=None,
         | 
| 170 | 
            +
                    heads_share=True,
         | 
| 171 | 
            +
                    block_length=None,
         | 
| 172 | 
            +
                    proximal_bias=False,
         | 
| 173 | 
            +
                    proximal_init=False,
         | 
| 174 | 
            +
                ):
         | 
| 175 | 
            +
                    super().__init__()
         | 
| 176 | 
            +
                    assert channels % n_heads == 0
         | 
| 177 | 
            +
             | 
| 178 | 
            +
                    self.channels = channels
         | 
| 179 | 
            +
                    self.out_channels = out_channels
         | 
| 180 | 
            +
                    self.n_heads = n_heads
         | 
| 181 | 
            +
                    self.p_dropout = p_dropout
         | 
| 182 | 
            +
                    self.window_size = window_size
         | 
| 183 | 
            +
                    self.heads_share = heads_share
         | 
| 184 | 
            +
                    self.block_length = block_length
         | 
| 185 | 
            +
                    self.proximal_bias = proximal_bias
         | 
| 186 | 
            +
                    self.proximal_init = proximal_init
         | 
| 187 | 
            +
                    self.attn = None
         | 
| 188 | 
            +
             | 
| 189 | 
            +
                    self.k_channels = channels // n_heads
         | 
| 190 | 
            +
                    self.conv_q = nn.Conv1d(channels, channels, 1)
         | 
| 191 | 
            +
                    self.conv_k = nn.Conv1d(channels, channels, 1)
         | 
| 192 | 
            +
                    self.conv_v = nn.Conv1d(channels, channels, 1)
         | 
| 193 | 
            +
                    self.conv_o = nn.Conv1d(channels, out_channels, 1)
         | 
| 194 | 
            +
                    self.drop = nn.Dropout(p_dropout)
         | 
| 195 | 
            +
             | 
| 196 | 
            +
                    if window_size is not None:
         | 
| 197 | 
            +
                        n_heads_rel = 1 if heads_share else n_heads
         | 
| 198 | 
            +
                        rel_stddev = self.k_channels**-0.5
         | 
| 199 | 
            +
                        self.emb_rel_k = nn.Parameter(
         | 
| 200 | 
            +
                            torch.randn(n_heads_rel, window_size * 2 + 1, self.k_channels)
         | 
| 201 | 
            +
                            * rel_stddev
         | 
| 202 | 
            +
                        )
         | 
| 203 | 
            +
                        self.emb_rel_v = nn.Parameter(
         | 
| 204 | 
            +
                            torch.randn(n_heads_rel, window_size * 2 + 1, self.k_channels)
         | 
| 205 | 
            +
                            * rel_stddev
         | 
| 206 | 
            +
                        )
         | 
| 207 | 
            +
             | 
| 208 | 
            +
                    nn.init.xavier_uniform_(self.conv_q.weight)
         | 
| 209 | 
            +
                    nn.init.xavier_uniform_(self.conv_k.weight)
         | 
| 210 | 
            +
                    nn.init.xavier_uniform_(self.conv_v.weight)
         | 
| 211 | 
            +
                    if proximal_init:
         | 
| 212 | 
            +
                        with torch.no_grad():
         | 
| 213 | 
            +
                            self.conv_k.weight.copy_(self.conv_q.weight)
         | 
| 214 | 
            +
                            self.conv_k.bias.copy_(self.conv_q.bias)
         | 
| 215 | 
            +
             | 
| 216 | 
            +
                def forward(self, x, c, attn_mask=None):
         | 
| 217 | 
            +
                    q = self.conv_q(x)
         | 
| 218 | 
            +
                    k = self.conv_k(c)
         | 
| 219 | 
            +
                    v = self.conv_v(c)
         | 
| 220 | 
            +
             | 
| 221 | 
            +
                    x, self.attn = self.attention(q, k, v, mask=attn_mask)
         | 
| 222 | 
            +
             | 
| 223 | 
            +
                    x = self.conv_o(x)
         | 
| 224 | 
            +
                    return x
         | 
| 225 | 
            +
             | 
| 226 | 
            +
                def attention(self, query, key, value, mask=None):
         | 
| 227 | 
            +
                    # reshape [b, d, t] -> [b, n_h, t, d_k]
         | 
| 228 | 
            +
                    b, d, t_s, t_t = (*key.size(), query.size(2))
         | 
| 229 | 
            +
                    query = query.view(b, self.n_heads, self.k_channels, t_t).transpose(2, 3)
         | 
| 230 | 
            +
                    key = key.view(b, self.n_heads, self.k_channels, t_s).transpose(2, 3)
         | 
| 231 | 
            +
                    value = value.view(b, self.n_heads, self.k_channels, t_s).transpose(2, 3)
         | 
| 232 | 
            +
             | 
| 233 | 
            +
                    scores = torch.matmul(query / math.sqrt(self.k_channels), key.transpose(-2, -1))
         | 
| 234 | 
            +
                    if self.window_size is not None:
         | 
| 235 | 
            +
                        assert (
         | 
| 236 | 
            +
                            t_s == t_t
         | 
| 237 | 
            +
                        ), "Relative attention is only available for self-attention."
         | 
| 238 | 
            +
                        key_relative_embeddings = self._get_relative_embeddings(self.emb_rel_k, t_s)
         | 
| 239 | 
            +
                        rel_logits = self._matmul_with_relative_keys(
         | 
| 240 | 
            +
                            query / math.sqrt(self.k_channels), key_relative_embeddings
         | 
| 241 | 
            +
                        )
         | 
| 242 | 
            +
                        scores_local = self._relative_position_to_absolute_position(rel_logits)
         | 
| 243 | 
            +
                        scores = scores + scores_local
         | 
| 244 | 
            +
                    if self.proximal_bias:
         | 
| 245 | 
            +
                        assert t_s == t_t, "Proximal bias is only available for self-attention."
         | 
| 246 | 
            +
                        scores = scores + self._attention_bias_proximal(t_s).to(
         | 
| 247 | 
            +
                            device=scores.device, dtype=scores.dtype
         | 
| 248 | 
            +
                        )
         | 
| 249 | 
            +
                    if mask is not None:
         | 
| 250 | 
            +
                        scores = scores.masked_fill(mask == 0, -1e4)
         | 
| 251 | 
            +
                        if self.block_length is not None:
         | 
| 252 | 
            +
                            assert (
         | 
| 253 | 
            +
                                t_s == t_t
         | 
| 254 | 
            +
                            ), "Local attention is only available for self-attention."
         | 
| 255 | 
            +
                            block_mask = (
         | 
| 256 | 
            +
                                torch.ones_like(scores)
         | 
| 257 | 
            +
                                .triu(-self.block_length)
         | 
| 258 | 
            +
                                .tril(self.block_length)
         | 
| 259 | 
            +
                            )
         | 
| 260 | 
            +
                            scores = scores.masked_fill(block_mask == 0, -1e4)
         | 
| 261 | 
            +
                    p_attn = F.softmax(scores, dim=-1)  # [b, n_h, t_t, t_s]
         | 
| 262 | 
            +
                    p_attn = self.drop(p_attn)
         | 
| 263 | 
            +
                    output = torch.matmul(p_attn, value)
         | 
| 264 | 
            +
                    if self.window_size is not None:
         | 
| 265 | 
            +
                        relative_weights = self._absolute_position_to_relative_position(p_attn)
         | 
| 266 | 
            +
                        value_relative_embeddings = self._get_relative_embeddings(
         | 
| 267 | 
            +
                            self.emb_rel_v, t_s
         | 
| 268 | 
            +
                        )
         | 
| 269 | 
            +
                        output = output + self._matmul_with_relative_values(
         | 
| 270 | 
            +
                            relative_weights, value_relative_embeddings
         | 
| 271 | 
            +
                        )
         | 
| 272 | 
            +
                    output = (
         | 
| 273 | 
            +
                        output.transpose(2, 3).contiguous().view(b, d, t_t)
         | 
| 274 | 
            +
                    )  # [b, n_h, t_t, d_k] -> [b, d, t_t]
         | 
| 275 | 
            +
                    return output, p_attn
         | 
| 276 | 
            +
             | 
| 277 | 
            +
                def _matmul_with_relative_values(self, x, y):
         | 
| 278 | 
            +
                    """
         | 
| 279 | 
            +
                    x: [b, h, l, m]
         | 
| 280 | 
            +
                    y: [h or 1, m, d]
         | 
| 281 | 
            +
                    ret: [b, h, l, d]
         | 
| 282 | 
            +
                    """
         | 
| 283 | 
            +
                    ret = torch.matmul(x, y.unsqueeze(0))
         | 
| 284 | 
            +
                    return ret
         | 
| 285 | 
            +
             | 
| 286 | 
            +
                def _matmul_with_relative_keys(self, x, y):
         | 
| 287 | 
            +
                    """
         | 
| 288 | 
            +
                    x: [b, h, l, d]
         | 
| 289 | 
            +
                    y: [h or 1, m, d]
         | 
| 290 | 
            +
                    ret: [b, h, l, m]
         | 
| 291 | 
            +
                    """
         | 
| 292 | 
            +
                    ret = torch.matmul(x, y.unsqueeze(0).transpose(-2, -1))
         | 
| 293 | 
            +
                    return ret
         | 
| 294 | 
            +
             | 
| 295 | 
            +
                def _get_relative_embeddings(self, relative_embeddings, length):
         | 
| 296 | 
            +
                    max_relative_position = 2 * self.window_size + 1
         | 
| 297 | 
            +
                    # Pad first before slice to avoid using cond ops.
         | 
| 298 | 
            +
                    pad_length = max(length - (self.window_size + 1), 0)
         | 
| 299 | 
            +
                    slice_start_position = max((self.window_size + 1) - length, 0)
         | 
| 300 | 
            +
                    slice_end_position = slice_start_position + 2 * length - 1
         | 
| 301 | 
            +
                    if pad_length > 0:
         | 
| 302 | 
            +
                        padded_relative_embeddings = F.pad(
         | 
| 303 | 
            +
                            relative_embeddings,
         | 
| 304 | 
            +
                            commons.convert_pad_shape([[0, 0], [pad_length, pad_length], [0, 0]]),
         | 
| 305 | 
            +
                        )
         | 
| 306 | 
            +
                    else:
         | 
| 307 | 
            +
                        padded_relative_embeddings = relative_embeddings
         | 
| 308 | 
            +
                    used_relative_embeddings = padded_relative_embeddings[
         | 
| 309 | 
            +
                        :, slice_start_position:slice_end_position
         | 
| 310 | 
            +
                    ]
         | 
| 311 | 
            +
                    return used_relative_embeddings
         | 
| 312 | 
            +
             | 
| 313 | 
            +
                def _relative_position_to_absolute_position(self, x):
         | 
| 314 | 
            +
                    """
         | 
| 315 | 
            +
                    x: [b, h, l, 2*l-1]
         | 
| 316 | 
            +
                    ret: [b, h, l, l]
         | 
| 317 | 
            +
                    """
         | 
| 318 | 
            +
                    batch, heads, length, _ = x.size()
         | 
| 319 | 
            +
                    # Concat columns of pad to shift from relative to absolute indexing.
         | 
| 320 | 
            +
                    x = F.pad(x, commons.convert_pad_shape([[0, 0], [0, 0], [0, 0], [0, 1]]))
         | 
| 321 | 
            +
             | 
| 322 | 
            +
                    # Concat extra elements so to add up to shape (len+1, 2*len-1).
         | 
| 323 | 
            +
                    x_flat = x.view([batch, heads, length * 2 * length])
         | 
| 324 | 
            +
                    x_flat = F.pad(
         | 
| 325 | 
            +
                        x_flat, commons.convert_pad_shape([[0, 0], [0, 0], [0, length - 1]])
         | 
| 326 | 
            +
                    )
         | 
| 327 | 
            +
             | 
| 328 | 
            +
                    # Reshape and slice out the padded elements.
         | 
| 329 | 
            +
                    x_final = x_flat.view([batch, heads, length + 1, 2 * length - 1])[
         | 
| 330 | 
            +
                        :, :, :length, length - 1 :
         | 
| 331 | 
            +
                    ]
         | 
| 332 | 
            +
                    return x_final
         | 
| 333 | 
            +
             | 
| 334 | 
            +
                def _absolute_position_to_relative_position(self, x):
         | 
| 335 | 
            +
                    """
         | 
| 336 | 
            +
                    x: [b, h, l, l]
         | 
| 337 | 
            +
                    ret: [b, h, l, 2*l-1]
         | 
| 338 | 
            +
                    """
         | 
| 339 | 
            +
                    batch, heads, length, _ = x.size()
         | 
| 340 | 
            +
                    # padd along column
         | 
| 341 | 
            +
                    x = F.pad(
         | 
| 342 | 
            +
                        x, commons.convert_pad_shape([[0, 0], [0, 0], [0, 0], [0, length - 1]])
         | 
| 343 | 
            +
                    )
         | 
| 344 | 
            +
                    x_flat = x.view([batch, heads, length**2 + length * (length - 1)])
         | 
| 345 | 
            +
                    # add 0's in the beginning that will skew the elements after reshape
         | 
| 346 | 
            +
                    x_flat = F.pad(x_flat, commons.convert_pad_shape([[0, 0], [0, 0], [length, 0]]))
         | 
| 347 | 
            +
                    x_final = x_flat.view([batch, heads, length, 2 * length])[:, :, :, 1:]
         | 
| 348 | 
            +
                    return x_final
         | 
| 349 | 
            +
             | 
| 350 | 
            +
                def _attention_bias_proximal(self, length):
         | 
| 351 | 
            +
                    """Bias for self-attention to encourage attention to close positions.
         | 
| 352 | 
            +
                    Args:
         | 
| 353 | 
            +
                      length: an integer scalar.
         | 
| 354 | 
            +
                    Returns:
         | 
| 355 | 
            +
                      a Tensor with shape [1, 1, length, length]
         | 
| 356 | 
            +
                    """
         | 
| 357 | 
            +
                    r = torch.arange(length, dtype=torch.float32)
         | 
| 358 | 
            +
                    diff = torch.unsqueeze(r, 0) - torch.unsqueeze(r, 1)
         | 
| 359 | 
            +
                    return torch.unsqueeze(torch.unsqueeze(-torch.log1p(torch.abs(diff)), 0), 0)
         | 
| 360 | 
            +
             | 
| 361 | 
            +
             | 
| 362 | 
            +
            class FFN(nn.Module):
         | 
| 363 | 
            +
                def __init__(
         | 
| 364 | 
            +
                    self,
         | 
| 365 | 
            +
                    in_channels,
         | 
| 366 | 
            +
                    out_channels,
         | 
| 367 | 
            +
                    filter_channels,
         | 
| 368 | 
            +
                    kernel_size,
         | 
| 369 | 
            +
                    p_dropout=0.0,
         | 
| 370 | 
            +
                    activation=None,
         | 
| 371 | 
            +
                    causal=False,
         | 
| 372 | 
            +
                ):
         | 
| 373 | 
            +
                    super().__init__()
         | 
| 374 | 
            +
                    self.in_channels = in_channels
         | 
| 375 | 
            +
                    self.out_channels = out_channels
         | 
| 376 | 
            +
                    self.filter_channels = filter_channels
         | 
| 377 | 
            +
                    self.kernel_size = kernel_size
         | 
| 378 | 
            +
                    self.p_dropout = p_dropout
         | 
| 379 | 
            +
                    self.activation = activation
         | 
| 380 | 
            +
                    self.causal = causal
         | 
| 381 | 
            +
             | 
| 382 | 
            +
                    if causal:
         | 
| 383 | 
            +
                        self.padding = self._causal_padding
         | 
| 384 | 
            +
                    else:
         | 
| 385 | 
            +
                        self.padding = self._same_padding
         | 
| 386 | 
            +
             | 
| 387 | 
            +
                    self.conv_1 = nn.Conv1d(in_channels, filter_channels, kernel_size)
         | 
| 388 | 
            +
                    self.conv_2 = nn.Conv1d(filter_channels, out_channels, kernel_size)
         | 
| 389 | 
            +
                    self.drop = nn.Dropout(p_dropout)
         | 
| 390 | 
            +
             | 
| 391 | 
            +
                def forward(self, x, x_mask):
         | 
| 392 | 
            +
                    x = self.conv_1(self.padding(x * x_mask))
         | 
| 393 | 
            +
                    if self.activation == "gelu":
         | 
| 394 | 
            +
                        x = x * torch.sigmoid(1.702 * x)
         | 
| 395 | 
            +
                    else:
         | 
| 396 | 
            +
                        x = torch.relu(x)
         | 
| 397 | 
            +
                    x = self.drop(x)
         | 
| 398 | 
            +
                    x = self.conv_2(self.padding(x * x_mask))
         | 
| 399 | 
            +
                    return x * x_mask
         | 
| 400 | 
            +
             | 
| 401 | 
            +
                def _causal_padding(self, x):
         | 
| 402 | 
            +
                    if self.kernel_size == 1:
         | 
| 403 | 
            +
                        return x
         | 
| 404 | 
            +
                    pad_l = self.kernel_size - 1
         | 
| 405 | 
            +
                    pad_r = 0
         | 
| 406 | 
            +
                    padding = [[0, 0], [0, 0], [pad_l, pad_r]]
         | 
| 407 | 
            +
                    x = F.pad(x, commons.convert_pad_shape(padding))
         | 
| 408 | 
            +
                    return x
         | 
| 409 | 
            +
             | 
| 410 | 
            +
                def _same_padding(self, x):
         | 
| 411 | 
            +
                    if self.kernel_size == 1:
         | 
| 412 | 
            +
                        return x
         | 
| 413 | 
            +
                    pad_l = (self.kernel_size - 1) // 2
         | 
| 414 | 
            +
                    pad_r = self.kernel_size // 2
         | 
| 415 | 
            +
                    padding = [[0, 0], [0, 0], [pad_l, pad_r]]
         | 
| 416 | 
            +
                    x = F.pad(x, commons.convert_pad_shape(padding))
         | 
| 417 | 
            +
                    return x
         | 
    	
        lib/infer_pack/commons.py
    ADDED
    
    | @@ -0,0 +1,166 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            import math
         | 
| 2 | 
            +
            import numpy as np
         | 
| 3 | 
            +
            import torch
         | 
| 4 | 
            +
            from torch import nn
         | 
| 5 | 
            +
            from torch.nn import functional as F
         | 
| 6 | 
            +
             | 
| 7 | 
            +
             | 
| 8 | 
            +
            def init_weights(m, mean=0.0, std=0.01):
         | 
| 9 | 
            +
                classname = m.__class__.__name__
         | 
| 10 | 
            +
                if classname.find("Conv") != -1:
         | 
| 11 | 
            +
                    m.weight.data.normal_(mean, std)
         | 
| 12 | 
            +
             | 
| 13 | 
            +
             | 
| 14 | 
            +
            def get_padding(kernel_size, dilation=1):
         | 
| 15 | 
            +
                return int((kernel_size * dilation - dilation) / 2)
         | 
| 16 | 
            +
             | 
| 17 | 
            +
             | 
| 18 | 
            +
            def convert_pad_shape(pad_shape):
         | 
| 19 | 
            +
                l = pad_shape[::-1]
         | 
| 20 | 
            +
                pad_shape = [item for sublist in l for item in sublist]
         | 
| 21 | 
            +
                return pad_shape
         | 
| 22 | 
            +
             | 
| 23 | 
            +
             | 
| 24 | 
            +
            def kl_divergence(m_p, logs_p, m_q, logs_q):
         | 
| 25 | 
            +
                """KL(P||Q)"""
         | 
| 26 | 
            +
                kl = (logs_q - logs_p) - 0.5
         | 
| 27 | 
            +
                kl += (
         | 
| 28 | 
            +
                    0.5 * (torch.exp(2.0 * logs_p) + ((m_p - m_q) ** 2)) * torch.exp(-2.0 * logs_q)
         | 
| 29 | 
            +
                )
         | 
| 30 | 
            +
                return kl
         | 
| 31 | 
            +
             | 
| 32 | 
            +
             | 
| 33 | 
            +
            def rand_gumbel(shape):
         | 
| 34 | 
            +
                """Sample from the Gumbel distribution, protect from overflows."""
         | 
| 35 | 
            +
                uniform_samples = torch.rand(shape) * 0.99998 + 0.00001
         | 
| 36 | 
            +
                return -torch.log(-torch.log(uniform_samples))
         | 
| 37 | 
            +
             | 
| 38 | 
            +
             | 
| 39 | 
            +
            def rand_gumbel_like(x):
         | 
| 40 | 
            +
                g = rand_gumbel(x.size()).to(dtype=x.dtype, device=x.device)
         | 
| 41 | 
            +
                return g
         | 
| 42 | 
            +
             | 
| 43 | 
            +
             | 
| 44 | 
            +
            def slice_segments(x, ids_str, segment_size=4):
         | 
| 45 | 
            +
                ret = torch.zeros_like(x[:, :, :segment_size])
         | 
| 46 | 
            +
                for i in range(x.size(0)):
         | 
| 47 | 
            +
                    idx_str = ids_str[i]
         | 
| 48 | 
            +
                    idx_end = idx_str + segment_size
         | 
| 49 | 
            +
                    ret[i] = x[i, :, idx_str:idx_end]
         | 
| 50 | 
            +
                return ret
         | 
| 51 | 
            +
             | 
| 52 | 
            +
             | 
| 53 | 
            +
            def slice_segments2(x, ids_str, segment_size=4):
         | 
| 54 | 
            +
                ret = torch.zeros_like(x[:, :segment_size])
         | 
| 55 | 
            +
                for i in range(x.size(0)):
         | 
| 56 | 
            +
                    idx_str = ids_str[i]
         | 
| 57 | 
            +
                    idx_end = idx_str + segment_size
         | 
| 58 | 
            +
                    ret[i] = x[i, idx_str:idx_end]
         | 
| 59 | 
            +
                return ret
         | 
| 60 | 
            +
             | 
| 61 | 
            +
             | 
| 62 | 
            +
            def rand_slice_segments(x, x_lengths=None, segment_size=4):
         | 
| 63 | 
            +
                b, d, t = x.size()
         | 
| 64 | 
            +
                if x_lengths is None:
         | 
| 65 | 
            +
                    x_lengths = t
         | 
| 66 | 
            +
                ids_str_max = x_lengths - segment_size + 1
         | 
| 67 | 
            +
                ids_str = (torch.rand([b]).to(device=x.device) * ids_str_max).to(dtype=torch.long)
         | 
| 68 | 
            +
                ret = slice_segments(x, ids_str, segment_size)
         | 
| 69 | 
            +
                return ret, ids_str
         | 
| 70 | 
            +
             | 
| 71 | 
            +
             | 
| 72 | 
            +
            def get_timing_signal_1d(length, channels, min_timescale=1.0, max_timescale=1.0e4):
         | 
| 73 | 
            +
                position = torch.arange(length, dtype=torch.float)
         | 
| 74 | 
            +
                num_timescales = channels // 2
         | 
| 75 | 
            +
                log_timescale_increment = math.log(float(max_timescale) / float(min_timescale)) / (
         | 
| 76 | 
            +
                    num_timescales - 1
         | 
| 77 | 
            +
                )
         | 
| 78 | 
            +
                inv_timescales = min_timescale * torch.exp(
         | 
| 79 | 
            +
                    torch.arange(num_timescales, dtype=torch.float) * -log_timescale_increment
         | 
| 80 | 
            +
                )
         | 
| 81 | 
            +
                scaled_time = position.unsqueeze(0) * inv_timescales.unsqueeze(1)
         | 
| 82 | 
            +
                signal = torch.cat([torch.sin(scaled_time), torch.cos(scaled_time)], 0)
         | 
| 83 | 
            +
                signal = F.pad(signal, [0, 0, 0, channels % 2])
         | 
| 84 | 
            +
                signal = signal.view(1, channels, length)
         | 
| 85 | 
            +
                return signal
         | 
| 86 | 
            +
             | 
| 87 | 
            +
             | 
| 88 | 
            +
            def add_timing_signal_1d(x, min_timescale=1.0, max_timescale=1.0e4):
         | 
| 89 | 
            +
                b, channels, length = x.size()
         | 
| 90 | 
            +
                signal = get_timing_signal_1d(length, channels, min_timescale, max_timescale)
         | 
| 91 | 
            +
                return x + signal.to(dtype=x.dtype, device=x.device)
         | 
| 92 | 
            +
             | 
| 93 | 
            +
             | 
| 94 | 
            +
            def cat_timing_signal_1d(x, min_timescale=1.0, max_timescale=1.0e4, axis=1):
         | 
| 95 | 
            +
                b, channels, length = x.size()
         | 
| 96 | 
            +
                signal = get_timing_signal_1d(length, channels, min_timescale, max_timescale)
         | 
| 97 | 
            +
                return torch.cat([x, signal.to(dtype=x.dtype, device=x.device)], axis)
         | 
| 98 | 
            +
             | 
| 99 | 
            +
             | 
| 100 | 
            +
            def subsequent_mask(length):
         | 
| 101 | 
            +
                mask = torch.tril(torch.ones(length, length)).unsqueeze(0).unsqueeze(0)
         | 
| 102 | 
            +
                return mask
         | 
| 103 | 
            +
             | 
| 104 | 
            +
             | 
| 105 | 
            +
            @torch.jit.script
         | 
| 106 | 
            +
            def fused_add_tanh_sigmoid_multiply(input_a, input_b, n_channels):
         | 
| 107 | 
            +
                n_channels_int = n_channels[0]
         | 
| 108 | 
            +
                in_act = input_a + input_b
         | 
| 109 | 
            +
                t_act = torch.tanh(in_act[:, :n_channels_int, :])
         | 
| 110 | 
            +
                s_act = torch.sigmoid(in_act[:, n_channels_int:, :])
         | 
| 111 | 
            +
                acts = t_act * s_act
         | 
| 112 | 
            +
                return acts
         | 
| 113 | 
            +
             | 
| 114 | 
            +
             | 
| 115 | 
            +
            def convert_pad_shape(pad_shape):
         | 
| 116 | 
            +
                l = pad_shape[::-1]
         | 
| 117 | 
            +
                pad_shape = [item for sublist in l for item in sublist]
         | 
| 118 | 
            +
                return pad_shape
         | 
| 119 | 
            +
             | 
| 120 | 
            +
             | 
| 121 | 
            +
            def shift_1d(x):
         | 
| 122 | 
            +
                x = F.pad(x, convert_pad_shape([[0, 0], [0, 0], [1, 0]]))[:, :, :-1]
         | 
| 123 | 
            +
                return x
         | 
| 124 | 
            +
             | 
| 125 | 
            +
             | 
| 126 | 
            +
            def sequence_mask(length, max_length=None):
         | 
| 127 | 
            +
                if max_length is None:
         | 
| 128 | 
            +
                    max_length = length.max()
         | 
| 129 | 
            +
                x = torch.arange(max_length, dtype=length.dtype, device=length.device)
         | 
| 130 | 
            +
                return x.unsqueeze(0) < length.unsqueeze(1)
         | 
| 131 | 
            +
             | 
| 132 | 
            +
             | 
| 133 | 
            +
            def generate_path(duration, mask):
         | 
| 134 | 
            +
                """
         | 
| 135 | 
            +
                duration: [b, 1, t_x]
         | 
| 136 | 
            +
                mask: [b, 1, t_y, t_x]
         | 
| 137 | 
            +
                """
         | 
| 138 | 
            +
                device = duration.device
         | 
| 139 | 
            +
             | 
| 140 | 
            +
                b, _, t_y, t_x = mask.shape
         | 
| 141 | 
            +
                cum_duration = torch.cumsum(duration, -1)
         | 
| 142 | 
            +
             | 
| 143 | 
            +
                cum_duration_flat = cum_duration.view(b * t_x)
         | 
| 144 | 
            +
                path = sequence_mask(cum_duration_flat, t_y).to(mask.dtype)
         | 
| 145 | 
            +
                path = path.view(b, t_x, t_y)
         | 
| 146 | 
            +
                path = path - F.pad(path, convert_pad_shape([[0, 0], [1, 0], [0, 0]]))[:, :-1]
         | 
| 147 | 
            +
                path = path.unsqueeze(1).transpose(2, 3) * mask
         | 
| 148 | 
            +
                return path
         | 
| 149 | 
            +
             | 
| 150 | 
            +
             | 
| 151 | 
            +
            def clip_grad_value_(parameters, clip_value, norm_type=2):
         | 
| 152 | 
            +
                if isinstance(parameters, torch.Tensor):
         | 
| 153 | 
            +
                    parameters = [parameters]
         | 
| 154 | 
            +
                parameters = list(filter(lambda p: p.grad is not None, parameters))
         | 
| 155 | 
            +
                norm_type = float(norm_type)
         | 
| 156 | 
            +
                if clip_value is not None:
         | 
| 157 | 
            +
                    clip_value = float(clip_value)
         | 
| 158 | 
            +
             | 
| 159 | 
            +
                total_norm = 0
         | 
| 160 | 
            +
                for p in parameters:
         | 
| 161 | 
            +
                    param_norm = p.grad.data.norm(norm_type)
         | 
| 162 | 
            +
                    total_norm += param_norm.item() ** norm_type
         | 
| 163 | 
            +
                    if clip_value is not None:
         | 
| 164 | 
            +
                        p.grad.data.clamp_(min=-clip_value, max=clip_value)
         | 
| 165 | 
            +
                total_norm = total_norm ** (1.0 / norm_type)
         | 
| 166 | 
            +
                return total_norm
         | 
    	
        lib/infer_pack/models.py
    ADDED
    
    | @@ -0,0 +1,1142 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            import math, pdb, os
         | 
| 2 | 
            +
            from time import time as ttime
         | 
| 3 | 
            +
            import torch
         | 
| 4 | 
            +
            from torch import nn
         | 
| 5 | 
            +
            from torch.nn import functional as F
         | 
| 6 | 
            +
            from lib.infer_pack import modules
         | 
| 7 | 
            +
            from lib.infer_pack import attentions
         | 
| 8 | 
            +
            from lib.infer_pack import commons
         | 
| 9 | 
            +
            from lib.infer_pack.commons import init_weights, get_padding
         | 
| 10 | 
            +
            from torch.nn import Conv1d, ConvTranspose1d, AvgPool1d, Conv2d
         | 
| 11 | 
            +
            from torch.nn.utils import weight_norm, remove_weight_norm, spectral_norm
         | 
| 12 | 
            +
            from lib.infer_pack.commons import init_weights
         | 
| 13 | 
            +
            import numpy as np
         | 
| 14 | 
            +
            from lib.infer_pack import commons
         | 
| 15 | 
            +
             | 
| 16 | 
            +
             | 
| 17 | 
            +
            class TextEncoder256(nn.Module):
         | 
| 18 | 
            +
                def __init__(
         | 
| 19 | 
            +
                    self,
         | 
| 20 | 
            +
                    out_channels,
         | 
| 21 | 
            +
                    hidden_channels,
         | 
| 22 | 
            +
                    filter_channels,
         | 
| 23 | 
            +
                    n_heads,
         | 
| 24 | 
            +
                    n_layers,
         | 
| 25 | 
            +
                    kernel_size,
         | 
| 26 | 
            +
                    p_dropout,
         | 
| 27 | 
            +
                    f0=True,
         | 
| 28 | 
            +
                ):
         | 
| 29 | 
            +
                    super().__init__()
         | 
| 30 | 
            +
                    self.out_channels = out_channels
         | 
| 31 | 
            +
                    self.hidden_channels = hidden_channels
         | 
| 32 | 
            +
                    self.filter_channels = filter_channels
         | 
| 33 | 
            +
                    self.n_heads = n_heads
         | 
| 34 | 
            +
                    self.n_layers = n_layers
         | 
| 35 | 
            +
                    self.kernel_size = kernel_size
         | 
| 36 | 
            +
                    self.p_dropout = p_dropout
         | 
| 37 | 
            +
                    self.emb_phone = nn.Linear(256, hidden_channels)
         | 
| 38 | 
            +
                    self.lrelu = nn.LeakyReLU(0.1, inplace=True)
         | 
| 39 | 
            +
                    if f0 == True:
         | 
| 40 | 
            +
                        self.emb_pitch = nn.Embedding(256, hidden_channels)  # pitch 256
         | 
| 41 | 
            +
                    self.encoder = attentions.Encoder(
         | 
| 42 | 
            +
                        hidden_channels, filter_channels, n_heads, n_layers, kernel_size, p_dropout
         | 
| 43 | 
            +
                    )
         | 
| 44 | 
            +
                    self.proj = nn.Conv1d(hidden_channels, out_channels * 2, 1)
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                def forward(self, phone, pitch, lengths):
         | 
| 47 | 
            +
                    if pitch == None:
         | 
| 48 | 
            +
                        x = self.emb_phone(phone)
         | 
| 49 | 
            +
                    else:
         | 
| 50 | 
            +
                        x = self.emb_phone(phone) + self.emb_pitch(pitch)
         | 
| 51 | 
            +
                    x = x * math.sqrt(self.hidden_channels)  # [b, t, h]
         | 
| 52 | 
            +
                    x = self.lrelu(x)
         | 
| 53 | 
            +
                    x = torch.transpose(x, 1, -1)  # [b, h, t]
         | 
| 54 | 
            +
                    x_mask = torch.unsqueeze(commons.sequence_mask(lengths, x.size(2)), 1).to(
         | 
| 55 | 
            +
                        x.dtype
         | 
| 56 | 
            +
                    )
         | 
| 57 | 
            +
                    x = self.encoder(x * x_mask, x_mask)
         | 
| 58 | 
            +
                    stats = self.proj(x) * x_mask
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                    m, logs = torch.split(stats, self.out_channels, dim=1)
         | 
| 61 | 
            +
                    return m, logs, x_mask
         | 
| 62 | 
            +
             | 
| 63 | 
            +
             | 
| 64 | 
            +
            class TextEncoder768(nn.Module):
         | 
| 65 | 
            +
                def __init__(
         | 
| 66 | 
            +
                    self,
         | 
| 67 | 
            +
                    out_channels,
         | 
| 68 | 
            +
                    hidden_channels,
         | 
| 69 | 
            +
                    filter_channels,
         | 
| 70 | 
            +
                    n_heads,
         | 
| 71 | 
            +
                    n_layers,
         | 
| 72 | 
            +
                    kernel_size,
         | 
| 73 | 
            +
                    p_dropout,
         | 
| 74 | 
            +
                    f0=True,
         | 
| 75 | 
            +
                ):
         | 
| 76 | 
            +
                    super().__init__()
         | 
| 77 | 
            +
                    self.out_channels = out_channels
         | 
| 78 | 
            +
                    self.hidden_channels = hidden_channels
         | 
| 79 | 
            +
                    self.filter_channels = filter_channels
         | 
| 80 | 
            +
                    self.n_heads = n_heads
         | 
| 81 | 
            +
                    self.n_layers = n_layers
         | 
| 82 | 
            +
                    self.kernel_size = kernel_size
         | 
| 83 | 
            +
                    self.p_dropout = p_dropout
         | 
| 84 | 
            +
                    self.emb_phone = nn.Linear(768, hidden_channels)
         | 
| 85 | 
            +
                    self.lrelu = nn.LeakyReLU(0.1, inplace=True)
         | 
| 86 | 
            +
                    if f0 == True:
         | 
| 87 | 
            +
                        self.emb_pitch = nn.Embedding(256, hidden_channels)  # pitch 256
         | 
| 88 | 
            +
                    self.encoder = attentions.Encoder(
         | 
| 89 | 
            +
                        hidden_channels, filter_channels, n_heads, n_layers, kernel_size, p_dropout
         | 
| 90 | 
            +
                    )
         | 
| 91 | 
            +
                    self.proj = nn.Conv1d(hidden_channels, out_channels * 2, 1)
         | 
| 92 | 
            +
             | 
| 93 | 
            +
                def forward(self, phone, pitch, lengths):
         | 
| 94 | 
            +
                    if pitch == None:
         | 
| 95 | 
            +
                        x = self.emb_phone(phone)
         | 
| 96 | 
            +
                    else:
         | 
| 97 | 
            +
                        x = self.emb_phone(phone) + self.emb_pitch(pitch)
         | 
| 98 | 
            +
                    x = x * math.sqrt(self.hidden_channels)  # [b, t, h]
         | 
| 99 | 
            +
                    x = self.lrelu(x)
         | 
| 100 | 
            +
                    x = torch.transpose(x, 1, -1)  # [b, h, t]
         | 
| 101 | 
            +
                    x_mask = torch.unsqueeze(commons.sequence_mask(lengths, x.size(2)), 1).to(
         | 
| 102 | 
            +
                        x.dtype
         | 
| 103 | 
            +
                    )
         | 
| 104 | 
            +
                    x = self.encoder(x * x_mask, x_mask)
         | 
| 105 | 
            +
                    stats = self.proj(x) * x_mask
         | 
| 106 | 
            +
             | 
| 107 | 
            +
                    m, logs = torch.split(stats, self.out_channels, dim=1)
         | 
| 108 | 
            +
                    return m, logs, x_mask
         | 
| 109 | 
            +
             | 
| 110 | 
            +
             | 
| 111 | 
            +
            class ResidualCouplingBlock(nn.Module):
         | 
| 112 | 
            +
                def __init__(
         | 
| 113 | 
            +
                    self,
         | 
| 114 | 
            +
                    channels,
         | 
| 115 | 
            +
                    hidden_channels,
         | 
| 116 | 
            +
                    kernel_size,
         | 
| 117 | 
            +
                    dilation_rate,
         | 
| 118 | 
            +
                    n_layers,
         | 
| 119 | 
            +
                    n_flows=4,
         | 
| 120 | 
            +
                    gin_channels=0,
         | 
| 121 | 
            +
                ):
         | 
| 122 | 
            +
                    super().__init__()
         | 
| 123 | 
            +
                    self.channels = channels
         | 
| 124 | 
            +
                    self.hidden_channels = hidden_channels
         | 
| 125 | 
            +
                    self.kernel_size = kernel_size
         | 
| 126 | 
            +
                    self.dilation_rate = dilation_rate
         | 
| 127 | 
            +
                    self.n_layers = n_layers
         | 
| 128 | 
            +
                    self.n_flows = n_flows
         | 
| 129 | 
            +
                    self.gin_channels = gin_channels
         | 
| 130 | 
            +
             | 
| 131 | 
            +
                    self.flows = nn.ModuleList()
         | 
| 132 | 
            +
                    for i in range(n_flows):
         | 
| 133 | 
            +
                        self.flows.append(
         | 
| 134 | 
            +
                            modules.ResidualCouplingLayer(
         | 
| 135 | 
            +
                                channels,
         | 
| 136 | 
            +
                                hidden_channels,
         | 
| 137 | 
            +
                                kernel_size,
         | 
| 138 | 
            +
                                dilation_rate,
         | 
| 139 | 
            +
                                n_layers,
         | 
| 140 | 
            +
                                gin_channels=gin_channels,
         | 
| 141 | 
            +
                                mean_only=True,
         | 
| 142 | 
            +
                            )
         | 
| 143 | 
            +
                        )
         | 
| 144 | 
            +
                        self.flows.append(modules.Flip())
         | 
| 145 | 
            +
             | 
| 146 | 
            +
                def forward(self, x, x_mask, g=None, reverse=False):
         | 
| 147 | 
            +
                    if not reverse:
         | 
| 148 | 
            +
                        for flow in self.flows:
         | 
| 149 | 
            +
                            x, _ = flow(x, x_mask, g=g, reverse=reverse)
         | 
| 150 | 
            +
                    else:
         | 
| 151 | 
            +
                        for flow in reversed(self.flows):
         | 
| 152 | 
            +
                            x = flow(x, x_mask, g=g, reverse=reverse)
         | 
| 153 | 
            +
                    return x
         | 
| 154 | 
            +
             | 
| 155 | 
            +
                def remove_weight_norm(self):
         | 
| 156 | 
            +
                    for i in range(self.n_flows):
         | 
| 157 | 
            +
                        self.flows[i * 2].remove_weight_norm()
         | 
| 158 | 
            +
             | 
| 159 | 
            +
             | 
| 160 | 
            +
            class PosteriorEncoder(nn.Module):
         | 
| 161 | 
            +
                def __init__(
         | 
| 162 | 
            +
                    self,
         | 
| 163 | 
            +
                    in_channels,
         | 
| 164 | 
            +
                    out_channels,
         | 
| 165 | 
            +
                    hidden_channels,
         | 
| 166 | 
            +
                    kernel_size,
         | 
| 167 | 
            +
                    dilation_rate,
         | 
| 168 | 
            +
                    n_layers,
         | 
| 169 | 
            +
                    gin_channels=0,
         | 
| 170 | 
            +
                ):
         | 
| 171 | 
            +
                    super().__init__()
         | 
| 172 | 
            +
                    self.in_channels = in_channels
         | 
| 173 | 
            +
                    self.out_channels = out_channels
         | 
| 174 | 
            +
                    self.hidden_channels = hidden_channels
         | 
| 175 | 
            +
                    self.kernel_size = kernel_size
         | 
| 176 | 
            +
                    self.dilation_rate = dilation_rate
         | 
| 177 | 
            +
                    self.n_layers = n_layers
         | 
| 178 | 
            +
                    self.gin_channels = gin_channels
         | 
| 179 | 
            +
             | 
| 180 | 
            +
                    self.pre = nn.Conv1d(in_channels, hidden_channels, 1)
         | 
| 181 | 
            +
                    self.enc = modules.WN(
         | 
| 182 | 
            +
                        hidden_channels,
         | 
| 183 | 
            +
                        kernel_size,
         | 
| 184 | 
            +
                        dilation_rate,
         | 
| 185 | 
            +
                        n_layers,
         | 
| 186 | 
            +
                        gin_channels=gin_channels,
         | 
| 187 | 
            +
                    )
         | 
| 188 | 
            +
                    self.proj = nn.Conv1d(hidden_channels, out_channels * 2, 1)
         | 
| 189 | 
            +
             | 
| 190 | 
            +
                def forward(self, x, x_lengths, g=None):
         | 
| 191 | 
            +
                    x_mask = torch.unsqueeze(commons.sequence_mask(x_lengths, x.size(2)), 1).to(
         | 
| 192 | 
            +
                        x.dtype
         | 
| 193 | 
            +
                    )
         | 
| 194 | 
            +
                    x = self.pre(x) * x_mask
         | 
| 195 | 
            +
                    x = self.enc(x, x_mask, g=g)
         | 
| 196 | 
            +
                    stats = self.proj(x) * x_mask
         | 
| 197 | 
            +
                    m, logs = torch.split(stats, self.out_channels, dim=1)
         | 
| 198 | 
            +
                    z = (m + torch.randn_like(m) * torch.exp(logs)) * x_mask
         | 
| 199 | 
            +
                    return z, m, logs, x_mask
         | 
| 200 | 
            +
             | 
| 201 | 
            +
                def remove_weight_norm(self):
         | 
| 202 | 
            +
                    self.enc.remove_weight_norm()
         | 
| 203 | 
            +
             | 
| 204 | 
            +
             | 
| 205 | 
            +
            class Generator(torch.nn.Module):
         | 
| 206 | 
            +
                def __init__(
         | 
| 207 | 
            +
                    self,
         | 
| 208 | 
            +
                    initial_channel,
         | 
| 209 | 
            +
                    resblock,
         | 
| 210 | 
            +
                    resblock_kernel_sizes,
         | 
| 211 | 
            +
                    resblock_dilation_sizes,
         | 
| 212 | 
            +
                    upsample_rates,
         | 
| 213 | 
            +
                    upsample_initial_channel,
         | 
| 214 | 
            +
                    upsample_kernel_sizes,
         | 
| 215 | 
            +
                    gin_channels=0,
         | 
| 216 | 
            +
                ):
         | 
| 217 | 
            +
                    super(Generator, self).__init__()
         | 
| 218 | 
            +
                    self.num_kernels = len(resblock_kernel_sizes)
         | 
| 219 | 
            +
                    self.num_upsamples = len(upsample_rates)
         | 
| 220 | 
            +
                    self.conv_pre = Conv1d(
         | 
| 221 | 
            +
                        initial_channel, upsample_initial_channel, 7, 1, padding=3
         | 
| 222 | 
            +
                    )
         | 
| 223 | 
            +
                    resblock = modules.ResBlock1 if resblock == "1" else modules.ResBlock2
         | 
| 224 | 
            +
             | 
| 225 | 
            +
                    self.ups = nn.ModuleList()
         | 
| 226 | 
            +
                    for i, (u, k) in enumerate(zip(upsample_rates, upsample_kernel_sizes)):
         | 
| 227 | 
            +
                        self.ups.append(
         | 
| 228 | 
            +
                            weight_norm(
         | 
| 229 | 
            +
                                ConvTranspose1d(
         | 
| 230 | 
            +
                                    upsample_initial_channel // (2**i),
         | 
| 231 | 
            +
                                    upsample_initial_channel // (2 ** (i + 1)),
         | 
| 232 | 
            +
                                    k,
         | 
| 233 | 
            +
                                    u,
         | 
| 234 | 
            +
                                    padding=(k - u) // 2,
         | 
| 235 | 
            +
                                )
         | 
| 236 | 
            +
                            )
         | 
| 237 | 
            +
                        )
         | 
| 238 | 
            +
             | 
| 239 | 
            +
                    self.resblocks = nn.ModuleList()
         | 
| 240 | 
            +
                    for i in range(len(self.ups)):
         | 
| 241 | 
            +
                        ch = upsample_initial_channel // (2 ** (i + 1))
         | 
| 242 | 
            +
                        for j, (k, d) in enumerate(
         | 
| 243 | 
            +
                            zip(resblock_kernel_sizes, resblock_dilation_sizes)
         | 
| 244 | 
            +
                        ):
         | 
| 245 | 
            +
                            self.resblocks.append(resblock(ch, k, d))
         | 
| 246 | 
            +
             | 
| 247 | 
            +
                    self.conv_post = Conv1d(ch, 1, 7, 1, padding=3, bias=False)
         | 
| 248 | 
            +
                    self.ups.apply(init_weights)
         | 
| 249 | 
            +
             | 
| 250 | 
            +
                    if gin_channels != 0:
         | 
| 251 | 
            +
                        self.cond = nn.Conv1d(gin_channels, upsample_initial_channel, 1)
         | 
| 252 | 
            +
             | 
| 253 | 
            +
                def forward(self, x, g=None):
         | 
| 254 | 
            +
                    x = self.conv_pre(x)
         | 
| 255 | 
            +
                    if g is not None:
         | 
| 256 | 
            +
                        x = x + self.cond(g)
         | 
| 257 | 
            +
             | 
| 258 | 
            +
                    for i in range(self.num_upsamples):
         | 
| 259 | 
            +
                        x = F.leaky_relu(x, modules.LRELU_SLOPE)
         | 
| 260 | 
            +
                        x = self.ups[i](x)
         | 
| 261 | 
            +
                        xs = None
         | 
| 262 | 
            +
                        for j in range(self.num_kernels):
         | 
| 263 | 
            +
                            if xs is None:
         | 
| 264 | 
            +
                                xs = self.resblocks[i * self.num_kernels + j](x)
         | 
| 265 | 
            +
                            else:
         | 
| 266 | 
            +
                                xs += self.resblocks[i * self.num_kernels + j](x)
         | 
| 267 | 
            +
                        x = xs / self.num_kernels
         | 
| 268 | 
            +
                    x = F.leaky_relu(x)
         | 
| 269 | 
            +
                    x = self.conv_post(x)
         | 
| 270 | 
            +
                    x = torch.tanh(x)
         | 
| 271 | 
            +
             | 
| 272 | 
            +
                    return x
         | 
| 273 | 
            +
             | 
| 274 | 
            +
                def remove_weight_norm(self):
         | 
| 275 | 
            +
                    for l in self.ups:
         | 
| 276 | 
            +
                        remove_weight_norm(l)
         | 
| 277 | 
            +
                    for l in self.resblocks:
         | 
| 278 | 
            +
                        l.remove_weight_norm()
         | 
| 279 | 
            +
             | 
| 280 | 
            +
             | 
| 281 | 
            +
            class SineGen(torch.nn.Module):
         | 
| 282 | 
            +
                """Definition of sine generator
         | 
| 283 | 
            +
                SineGen(samp_rate, harmonic_num = 0,
         | 
| 284 | 
            +
                        sine_amp = 0.1, noise_std = 0.003,
         | 
| 285 | 
            +
                        voiced_threshold = 0,
         | 
| 286 | 
            +
                        flag_for_pulse=False)
         | 
| 287 | 
            +
                samp_rate: sampling rate in Hz
         | 
| 288 | 
            +
                harmonic_num: number of harmonic overtones (default 0)
         | 
| 289 | 
            +
                sine_amp: amplitude of sine-wavefrom (default 0.1)
         | 
| 290 | 
            +
                noise_std: std of Gaussian noise (default 0.003)
         | 
| 291 | 
            +
                voiced_thoreshold: F0 threshold for U/V classification (default 0)
         | 
| 292 | 
            +
                flag_for_pulse: this SinGen is used inside PulseGen (default False)
         | 
| 293 | 
            +
                Note: when flag_for_pulse is True, the first time step of a voiced
         | 
| 294 | 
            +
                    segment is always sin(np.pi) or cos(0)
         | 
| 295 | 
            +
                """
         | 
| 296 | 
            +
             | 
| 297 | 
            +
                def __init__(
         | 
| 298 | 
            +
                    self,
         | 
| 299 | 
            +
                    samp_rate,
         | 
| 300 | 
            +
                    harmonic_num=0,
         | 
| 301 | 
            +
                    sine_amp=0.1,
         | 
| 302 | 
            +
                    noise_std=0.003,
         | 
| 303 | 
            +
                    voiced_threshold=0,
         | 
| 304 | 
            +
                    flag_for_pulse=False,
         | 
| 305 | 
            +
                ):
         | 
| 306 | 
            +
                    super(SineGen, self).__init__()
         | 
| 307 | 
            +
                    self.sine_amp = sine_amp
         | 
| 308 | 
            +
                    self.noise_std = noise_std
         | 
| 309 | 
            +
                    self.harmonic_num = harmonic_num
         | 
| 310 | 
            +
                    self.dim = self.harmonic_num + 1
         | 
| 311 | 
            +
                    self.sampling_rate = samp_rate
         | 
| 312 | 
            +
                    self.voiced_threshold = voiced_threshold
         | 
| 313 | 
            +
             | 
| 314 | 
            +
                def _f02uv(self, f0):
         | 
| 315 | 
            +
                    # generate uv signal
         | 
| 316 | 
            +
                    uv = torch.ones_like(f0)
         | 
| 317 | 
            +
                    uv = uv * (f0 > self.voiced_threshold)
         | 
| 318 | 
            +
                    return uv
         | 
| 319 | 
            +
             | 
| 320 | 
            +
                def forward(self, f0, upp):
         | 
| 321 | 
            +
                    """sine_tensor, uv = forward(f0)
         | 
| 322 | 
            +
                    input F0: tensor(batchsize=1, length, dim=1)
         | 
| 323 | 
            +
                              f0 for unvoiced steps should be 0
         | 
| 324 | 
            +
                    output sine_tensor: tensor(batchsize=1, length, dim)
         | 
| 325 | 
            +
                    output uv: tensor(batchsize=1, length, 1)
         | 
| 326 | 
            +
                    """
         | 
| 327 | 
            +
                    with torch.no_grad():
         | 
| 328 | 
            +
                        f0 = f0[:, None].transpose(1, 2)
         | 
| 329 | 
            +
                        f0_buf = torch.zeros(f0.shape[0], f0.shape[1], self.dim, device=f0.device)
         | 
| 330 | 
            +
                        # fundamental component
         | 
| 331 | 
            +
                        f0_buf[:, :, 0] = f0[:, :, 0]
         | 
| 332 | 
            +
                        for idx in np.arange(self.harmonic_num):
         | 
| 333 | 
            +
                            f0_buf[:, :, idx + 1] = f0_buf[:, :, 0] * (
         | 
| 334 | 
            +
                                idx + 2
         | 
| 335 | 
            +
                            )  # idx + 2: the (idx+1)-th overtone, (idx+2)-th harmonic
         | 
| 336 | 
            +
                        rad_values = (f0_buf / self.sampling_rate) % 1  ###%1 means that the product of n_har cannot be post-processed and optimized
         | 
| 337 | 
            +
                        rand_ini = torch.rand(
         | 
| 338 | 
            +
                            f0_buf.shape[0], f0_buf.shape[2], device=f0_buf.device
         | 
| 339 | 
            +
                        )
         | 
| 340 | 
            +
                        rand_ini[:, 0] = 0
         | 
| 341 | 
            +
                        rad_values[:, 0, :] = rad_values[:, 0, :] + rand_ini
         | 
| 342 | 
            +
                        tmp_over_one = torch.cumsum(rad_values, 1)  # % 1  #####%1 means that the following cumsum can no longer be optimized
         | 
| 343 | 
            +
                        tmp_over_one *= upp
         | 
| 344 | 
            +
                        tmp_over_one = F.interpolate(
         | 
| 345 | 
            +
                            tmp_over_one.transpose(2, 1),
         | 
| 346 | 
            +
                            scale_factor=upp,
         | 
| 347 | 
            +
                            mode="linear",
         | 
| 348 | 
            +
                            align_corners=True,
         | 
| 349 | 
            +
                        ).transpose(2, 1)
         | 
| 350 | 
            +
                        rad_values = F.interpolate(
         | 
| 351 | 
            +
                            rad_values.transpose(2, 1), scale_factor=upp, mode="nearest"
         | 
| 352 | 
            +
                        ).transpose(
         | 
| 353 | 
            +
                            2, 1
         | 
| 354 | 
            +
                        )  #######
         | 
| 355 | 
            +
                        tmp_over_one %= 1
         | 
| 356 | 
            +
                        tmp_over_one_idx = (tmp_over_one[:, 1:, :] - tmp_over_one[:, :-1, :]) < 0
         | 
| 357 | 
            +
                        cumsum_shift = torch.zeros_like(rad_values)
         | 
| 358 | 
            +
                        cumsum_shift[:, 1:, :] = tmp_over_one_idx * -1.0
         | 
| 359 | 
            +
                        sine_waves = torch.sin(
         | 
| 360 | 
            +
                            torch.cumsum(rad_values + cumsum_shift, dim=1) * 2 * np.pi
         | 
| 361 | 
            +
                        )
         | 
| 362 | 
            +
                        sine_waves = sine_waves * self.sine_amp
         | 
| 363 | 
            +
                        uv = self._f02uv(f0)
         | 
| 364 | 
            +
                        uv = F.interpolate(
         | 
| 365 | 
            +
                            uv.transpose(2, 1), scale_factor=upp, mode="nearest"
         | 
| 366 | 
            +
                        ).transpose(2, 1)
         | 
| 367 | 
            +
                        noise_amp = uv * self.noise_std + (1 - uv) * self.sine_amp / 3
         | 
| 368 | 
            +
                        noise = noise_amp * torch.randn_like(sine_waves)
         | 
| 369 | 
            +
                        sine_waves = sine_waves * uv + noise
         | 
| 370 | 
            +
                    return sine_waves, uv, noise
         | 
| 371 | 
            +
             | 
| 372 | 
            +
             | 
| 373 | 
            +
            class SourceModuleHnNSF(torch.nn.Module):
         | 
| 374 | 
            +
                """SourceModule for hn-nsf
         | 
| 375 | 
            +
                SourceModule(sampling_rate, harmonic_num=0, sine_amp=0.1,
         | 
| 376 | 
            +
                             add_noise_std=0.003, voiced_threshod=0)
         | 
| 377 | 
            +
                sampling_rate: sampling_rate in Hz
         | 
| 378 | 
            +
                harmonic_num: number of harmonic above F0 (default: 0)
         | 
| 379 | 
            +
                sine_amp: amplitude of sine source signal (default: 0.1)
         | 
| 380 | 
            +
                add_noise_std: std of additive Gaussian noise (default: 0.003)
         | 
| 381 | 
            +
                    note that amplitude of noise in unvoiced is decided
         | 
| 382 | 
            +
                    by sine_amp
         | 
| 383 | 
            +
                voiced_threshold: threhold to set U/V given F0 (default: 0)
         | 
| 384 | 
            +
                Sine_source, noise_source = SourceModuleHnNSF(F0_sampled)
         | 
| 385 | 
            +
                F0_sampled (batchsize, length, 1)
         | 
| 386 | 
            +
                Sine_source (batchsize, length, 1)
         | 
| 387 | 
            +
                noise_source (batchsize, length 1)
         | 
| 388 | 
            +
                uv (batchsize, length, 1)
         | 
| 389 | 
            +
                """
         | 
| 390 | 
            +
             | 
| 391 | 
            +
                def __init__(
         | 
| 392 | 
            +
                    self,
         | 
| 393 | 
            +
                    sampling_rate,
         | 
| 394 | 
            +
                    harmonic_num=0,
         | 
| 395 | 
            +
                    sine_amp=0.1,
         | 
| 396 | 
            +
                    add_noise_std=0.003,
         | 
| 397 | 
            +
                    voiced_threshod=0,
         | 
| 398 | 
            +
                    is_half=True,
         | 
| 399 | 
            +
                ):
         | 
| 400 | 
            +
                    super(SourceModuleHnNSF, self).__init__()
         | 
| 401 | 
            +
             | 
| 402 | 
            +
                    self.sine_amp = sine_amp
         | 
| 403 | 
            +
                    self.noise_std = add_noise_std
         | 
| 404 | 
            +
                    self.is_half = is_half
         | 
| 405 | 
            +
                    # to produce sine waveforms
         | 
| 406 | 
            +
                    self.l_sin_gen = SineGen(
         | 
| 407 | 
            +
                        sampling_rate, harmonic_num, sine_amp, add_noise_std, voiced_threshod
         | 
| 408 | 
            +
                    )
         | 
| 409 | 
            +
             | 
| 410 | 
            +
                    # to merge source harmonics into a single excitation
         | 
| 411 | 
            +
                    self.l_linear = torch.nn.Linear(harmonic_num + 1, 1)
         | 
| 412 | 
            +
                    self.l_tanh = torch.nn.Tanh()
         | 
| 413 | 
            +
             | 
| 414 | 
            +
                def forward(self, x, upp=None):
         | 
| 415 | 
            +
                    sine_wavs, uv, _ = self.l_sin_gen(x, upp)
         | 
| 416 | 
            +
                    if self.is_half:
         | 
| 417 | 
            +
                        sine_wavs = sine_wavs.half()
         | 
| 418 | 
            +
                    sine_merge = self.l_tanh(self.l_linear(sine_wavs))
         | 
| 419 | 
            +
                    return sine_merge, None, None  # noise, uv
         | 
| 420 | 
            +
             | 
| 421 | 
            +
             | 
| 422 | 
            +
            class GeneratorNSF(torch.nn.Module):
         | 
| 423 | 
            +
                def __init__(
         | 
| 424 | 
            +
                    self,
         | 
| 425 | 
            +
                    initial_channel,
         | 
| 426 | 
            +
                    resblock,
         | 
| 427 | 
            +
                    resblock_kernel_sizes,
         | 
| 428 | 
            +
                    resblock_dilation_sizes,
         | 
| 429 | 
            +
                    upsample_rates,
         | 
| 430 | 
            +
                    upsample_initial_channel,
         | 
| 431 | 
            +
                    upsample_kernel_sizes,
         | 
| 432 | 
            +
                    gin_channels,
         | 
| 433 | 
            +
                    sr,
         | 
| 434 | 
            +
                    is_half=False,
         | 
| 435 | 
            +
                ):
         | 
| 436 | 
            +
                    super(GeneratorNSF, self).__init__()
         | 
| 437 | 
            +
                    self.num_kernels = len(resblock_kernel_sizes)
         | 
| 438 | 
            +
                    self.num_upsamples = len(upsample_rates)
         | 
| 439 | 
            +
             | 
| 440 | 
            +
                    self.f0_upsamp = torch.nn.Upsample(scale_factor=np.prod(upsample_rates))
         | 
| 441 | 
            +
                    self.m_source = SourceModuleHnNSF(
         | 
| 442 | 
            +
                        sampling_rate=sr, harmonic_num=0, is_half=is_half
         | 
| 443 | 
            +
                    )
         | 
| 444 | 
            +
                    self.noise_convs = nn.ModuleList()
         | 
| 445 | 
            +
                    self.conv_pre = Conv1d(
         | 
| 446 | 
            +
                        initial_channel, upsample_initial_channel, 7, 1, padding=3
         | 
| 447 | 
            +
                    )
         | 
| 448 | 
            +
                    resblock = modules.ResBlock1 if resblock == "1" else modules.ResBlock2
         | 
| 449 | 
            +
             | 
| 450 | 
            +
                    self.ups = nn.ModuleList()
         | 
| 451 | 
            +
                    for i, (u, k) in enumerate(zip(upsample_rates, upsample_kernel_sizes)):
         | 
| 452 | 
            +
                        c_cur = upsample_initial_channel // (2 ** (i + 1))
         | 
| 453 | 
            +
                        self.ups.append(
         | 
| 454 | 
            +
                            weight_norm(
         | 
| 455 | 
            +
                                ConvTranspose1d(
         | 
| 456 | 
            +
                                    upsample_initial_channel // (2**i),
         | 
| 457 | 
            +
                                    upsample_initial_channel // (2 ** (i + 1)),
         | 
| 458 | 
            +
                                    k,
         | 
| 459 | 
            +
                                    u,
         | 
| 460 | 
            +
                                    padding=(k - u) // 2,
         | 
| 461 | 
            +
                                )
         | 
| 462 | 
            +
                            )
         | 
| 463 | 
            +
                        )
         | 
| 464 | 
            +
                        if i + 1 < len(upsample_rates):
         | 
| 465 | 
            +
                            stride_f0 = np.prod(upsample_rates[i + 1 :])
         | 
| 466 | 
            +
                            self.noise_convs.append(
         | 
| 467 | 
            +
                                Conv1d(
         | 
| 468 | 
            +
                                    1,
         | 
| 469 | 
            +
                                    c_cur,
         | 
| 470 | 
            +
                                    kernel_size=stride_f0 * 2,
         | 
| 471 | 
            +
                                    stride=stride_f0,
         | 
| 472 | 
            +
                                    padding=stride_f0 // 2,
         | 
| 473 | 
            +
                                )
         | 
| 474 | 
            +
                            )
         | 
| 475 | 
            +
                        else:
         | 
| 476 | 
            +
                            self.noise_convs.append(Conv1d(1, c_cur, kernel_size=1))
         | 
| 477 | 
            +
             | 
| 478 | 
            +
                    self.resblocks = nn.ModuleList()
         | 
| 479 | 
            +
                    for i in range(len(self.ups)):
         | 
| 480 | 
            +
                        ch = upsample_initial_channel // (2 ** (i + 1))
         | 
| 481 | 
            +
                        for j, (k, d) in enumerate(
         | 
| 482 | 
            +
                            zip(resblock_kernel_sizes, resblock_dilation_sizes)
         | 
| 483 | 
            +
                        ):
         | 
| 484 | 
            +
                            self.resblocks.append(resblock(ch, k, d))
         | 
| 485 | 
            +
             | 
| 486 | 
            +
                    self.conv_post = Conv1d(ch, 1, 7, 1, padding=3, bias=False)
         | 
| 487 | 
            +
                    self.ups.apply(init_weights)
         | 
| 488 | 
            +
             | 
| 489 | 
            +
                    if gin_channels != 0:
         | 
| 490 | 
            +
                        self.cond = nn.Conv1d(gin_channels, upsample_initial_channel, 1)
         | 
| 491 | 
            +
             | 
| 492 | 
            +
                    self.upp = np.prod(upsample_rates)
         | 
| 493 | 
            +
             | 
| 494 | 
            +
                def forward(self, x, f0, g=None):
         | 
| 495 | 
            +
                    har_source, noi_source, uv = self.m_source(f0, self.upp)
         | 
| 496 | 
            +
                    har_source = har_source.transpose(1, 2)
         | 
| 497 | 
            +
                    x = self.conv_pre(x)
         | 
| 498 | 
            +
                    if g is not None:
         | 
| 499 | 
            +
                        x = x + self.cond(g)
         | 
| 500 | 
            +
             | 
| 501 | 
            +
                    for i in range(self.num_upsamples):
         | 
| 502 | 
            +
                        x = F.leaky_relu(x, modules.LRELU_SLOPE)
         | 
| 503 | 
            +
                        x = self.ups[i](x)
         | 
| 504 | 
            +
                        x_source = self.noise_convs[i](har_source)
         | 
| 505 | 
            +
                        x = x + x_source
         | 
| 506 | 
            +
                        xs = None
         | 
| 507 | 
            +
                        for j in range(self.num_kernels):
         | 
| 508 | 
            +
                            if xs is None:
         | 
| 509 | 
            +
                                xs = self.resblocks[i * self.num_kernels + j](x)
         | 
| 510 | 
            +
                            else:
         | 
| 511 | 
            +
                                xs += self.resblocks[i * self.num_kernels + j](x)
         | 
| 512 | 
            +
                        x = xs / self.num_kernels
         | 
| 513 | 
            +
                    x = F.leaky_relu(x)
         | 
| 514 | 
            +
                    x = self.conv_post(x)
         | 
| 515 | 
            +
                    x = torch.tanh(x)
         | 
| 516 | 
            +
                    return x
         | 
| 517 | 
            +
             | 
| 518 | 
            +
                def remove_weight_norm(self):
         | 
| 519 | 
            +
                    for l in self.ups:
         | 
| 520 | 
            +
                        remove_weight_norm(l)
         | 
| 521 | 
            +
                    for l in self.resblocks:
         | 
| 522 | 
            +
                        l.remove_weight_norm()
         | 
| 523 | 
            +
             | 
| 524 | 
            +
             | 
| 525 | 
            +
            sr2sr = {
         | 
| 526 | 
            +
                "32k": 32000,
         | 
| 527 | 
            +
                "40k": 40000,
         | 
| 528 | 
            +
                "48k": 48000,
         | 
| 529 | 
            +
            }
         | 
| 530 | 
            +
             | 
| 531 | 
            +
             | 
| 532 | 
            +
            class SynthesizerTrnMs256NSFsid(nn.Module):
         | 
| 533 | 
            +
                def __init__(
         | 
| 534 | 
            +
                    self,
         | 
| 535 | 
            +
                    spec_channels,
         | 
| 536 | 
            +
                    segment_size,
         | 
| 537 | 
            +
                    inter_channels,
         | 
| 538 | 
            +
                    hidden_channels,
         | 
| 539 | 
            +
                    filter_channels,
         | 
| 540 | 
            +
                    n_heads,
         | 
| 541 | 
            +
                    n_layers,
         | 
| 542 | 
            +
                    kernel_size,
         | 
| 543 | 
            +
                    p_dropout,
         | 
| 544 | 
            +
                    resblock,
         | 
| 545 | 
            +
                    resblock_kernel_sizes,
         | 
| 546 | 
            +
                    resblock_dilation_sizes,
         | 
| 547 | 
            +
                    upsample_rates,
         | 
| 548 | 
            +
                    upsample_initial_channel,
         | 
| 549 | 
            +
                    upsample_kernel_sizes,
         | 
| 550 | 
            +
                    spk_embed_dim,
         | 
| 551 | 
            +
                    gin_channels,
         | 
| 552 | 
            +
                    sr,
         | 
| 553 | 
            +
                    **kwargs
         | 
| 554 | 
            +
                ):
         | 
| 555 | 
            +
                    super().__init__()
         | 
| 556 | 
            +
                    if type(sr) == type("strr"):
         | 
| 557 | 
            +
                        sr = sr2sr[sr]
         | 
| 558 | 
            +
                    self.spec_channels = spec_channels
         | 
| 559 | 
            +
                    self.inter_channels = inter_channels
         | 
| 560 | 
            +
                    self.hidden_channels = hidden_channels
         | 
| 561 | 
            +
                    self.filter_channels = filter_channels
         | 
| 562 | 
            +
                    self.n_heads = n_heads
         | 
| 563 | 
            +
                    self.n_layers = n_layers
         | 
| 564 | 
            +
                    self.kernel_size = kernel_size
         | 
| 565 | 
            +
                    self.p_dropout = p_dropout
         | 
| 566 | 
            +
                    self.resblock = resblock
         | 
| 567 | 
            +
                    self.resblock_kernel_sizes = resblock_kernel_sizes
         | 
| 568 | 
            +
                    self.resblock_dilation_sizes = resblock_dilation_sizes
         | 
| 569 | 
            +
                    self.upsample_rates = upsample_rates
         | 
| 570 | 
            +
                    self.upsample_initial_channel = upsample_initial_channel
         | 
| 571 | 
            +
                    self.upsample_kernel_sizes = upsample_kernel_sizes
         | 
| 572 | 
            +
                    self.segment_size = segment_size
         | 
| 573 | 
            +
                    self.gin_channels = gin_channels
         | 
| 574 | 
            +
                    # self.hop_length = hop_length#
         | 
| 575 | 
            +
                    self.spk_embed_dim = spk_embed_dim
         | 
| 576 | 
            +
                    self.enc_p = TextEncoder256(
         | 
| 577 | 
            +
                        inter_channels,
         | 
| 578 | 
            +
                        hidden_channels,
         | 
| 579 | 
            +
                        filter_channels,
         | 
| 580 | 
            +
                        n_heads,
         | 
| 581 | 
            +
                        n_layers,
         | 
| 582 | 
            +
                        kernel_size,
         | 
| 583 | 
            +
                        p_dropout,
         | 
| 584 | 
            +
                    )
         | 
| 585 | 
            +
                    self.dec = GeneratorNSF(
         | 
| 586 | 
            +
                        inter_channels,
         | 
| 587 | 
            +
                        resblock,
         | 
| 588 | 
            +
                        resblock_kernel_sizes,
         | 
| 589 | 
            +
                        resblock_dilation_sizes,
         | 
| 590 | 
            +
                        upsample_rates,
         | 
| 591 | 
            +
                        upsample_initial_channel,
         | 
| 592 | 
            +
                        upsample_kernel_sizes,
         | 
| 593 | 
            +
                        gin_channels=gin_channels,
         | 
| 594 | 
            +
                        sr=sr,
         | 
| 595 | 
            +
                        is_half=kwargs["is_half"],
         | 
| 596 | 
            +
                    )
         | 
| 597 | 
            +
                    self.enc_q = PosteriorEncoder(
         | 
| 598 | 
            +
                        spec_channels,
         | 
| 599 | 
            +
                        inter_channels,
         | 
| 600 | 
            +
                        hidden_channels,
         | 
| 601 | 
            +
                        5,
         | 
| 602 | 
            +
                        1,
         | 
| 603 | 
            +
                        16,
         | 
| 604 | 
            +
                        gin_channels=gin_channels,
         | 
| 605 | 
            +
                    )
         | 
| 606 | 
            +
                    self.flow = ResidualCouplingBlock(
         | 
| 607 | 
            +
                        inter_channels, hidden_channels, 5, 1, 3, gin_channels=gin_channels
         | 
| 608 | 
            +
                    )
         | 
| 609 | 
            +
                    self.emb_g = nn.Embedding(self.spk_embed_dim, gin_channels)
         | 
| 610 | 
            +
                    print("gin_channels:", gin_channels, "self.spk_embed_dim:", self.spk_embed_dim)
         | 
| 611 | 
            +
             | 
| 612 | 
            +
                def remove_weight_norm(self):
         | 
| 613 | 
            +
                    self.dec.remove_weight_norm()
         | 
| 614 | 
            +
                    self.flow.remove_weight_norm()
         | 
| 615 | 
            +
                    self.enc_q.remove_weight_norm()
         | 
| 616 | 
            +
             | 
| 617 | 
            +
                def forward(
         | 
| 618 | 
            +
                    self, phone, phone_lengths, pitch, pitchf, y, y_lengths, ds
         | 
| 619 | 
            +
                ):  # Here ds is id, [bs,1]
         | 
| 620 | 
            +
                    # print(1,pitch.shape)#[bs,t]
         | 
| 621 | 
            +
                    g = self.emb_g(ds).unsqueeze(-1)  # [b, 256, 1]##1 is t, broadcast
         | 
| 622 | 
            +
                    m_p, logs_p, x_mask = self.enc_p(phone, pitch, phone_lengths)
         | 
| 623 | 
            +
                    z, m_q, logs_q, y_mask = self.enc_q(y, y_lengths, g=g)
         | 
| 624 | 
            +
                    z_p = self.flow(z, y_mask, g=g)
         | 
| 625 | 
            +
                    z_slice, ids_slice = commons.rand_slice_segments(
         | 
| 626 | 
            +
                        z, y_lengths, self.segment_size
         | 
| 627 | 
            +
                    )
         | 
| 628 | 
            +
                    # print(-1,pitchf.shape,ids_slice,self.segment_size,self.hop_length,self.segment_size//self.hop_length)
         | 
| 629 | 
            +
                    pitchf = commons.slice_segments2(pitchf, ids_slice, self.segment_size)
         | 
| 630 | 
            +
                    # print(-2,pitchf.shape,z_slice.shape)
         | 
| 631 | 
            +
                    o = self.dec(z_slice, pitchf, g=g)
         | 
| 632 | 
            +
                    return o, ids_slice, x_mask, y_mask, (z, z_p, m_p, logs_p, m_q, logs_q)
         | 
| 633 | 
            +
             | 
| 634 | 
            +
                def infer(self, phone, phone_lengths, pitch, nsff0, sid, rate=None):
         | 
| 635 | 
            +
                    g = self.emb_g(sid).unsqueeze(-1)
         | 
| 636 | 
            +
                    m_p, logs_p, x_mask = self.enc_p(phone, pitch, phone_lengths)
         | 
| 637 | 
            +
                    z_p = (m_p + torch.exp(logs_p) * torch.randn_like(m_p) * 0.66666) * x_mask
         | 
| 638 | 
            +
                    if rate:
         | 
| 639 | 
            +
                        head = int(z_p.shape[2] * rate)
         | 
| 640 | 
            +
                        z_p = z_p[:, :, -head:]
         | 
| 641 | 
            +
                        x_mask = x_mask[:, :, -head:]
         | 
| 642 | 
            +
                        nsff0 = nsff0[:, -head:]
         | 
| 643 | 
            +
                    z = self.flow(z_p, x_mask, g=g, reverse=True)
         | 
| 644 | 
            +
                    o = self.dec(z * x_mask, nsff0, g=g)
         | 
| 645 | 
            +
                    return o, x_mask, (z, z_p, m_p, logs_p)
         | 
| 646 | 
            +
             | 
| 647 | 
            +
             | 
| 648 | 
            +
            class SynthesizerTrnMs768NSFsid(nn.Module):
         | 
| 649 | 
            +
                def __init__(
         | 
| 650 | 
            +
                    self,
         | 
| 651 | 
            +
                    spec_channels,
         | 
| 652 | 
            +
                    segment_size,
         | 
| 653 | 
            +
                    inter_channels,
         | 
| 654 | 
            +
                    hidden_channels,
         | 
| 655 | 
            +
                    filter_channels,
         | 
| 656 | 
            +
                    n_heads,
         | 
| 657 | 
            +
                    n_layers,
         | 
| 658 | 
            +
                    kernel_size,
         | 
| 659 | 
            +
                    p_dropout,
         | 
| 660 | 
            +
                    resblock,
         | 
| 661 | 
            +
                    resblock_kernel_sizes,
         | 
| 662 | 
            +
                    resblock_dilation_sizes,
         | 
| 663 | 
            +
                    upsample_rates,
         | 
| 664 | 
            +
                    upsample_initial_channel,
         | 
| 665 | 
            +
                    upsample_kernel_sizes,
         | 
| 666 | 
            +
                    spk_embed_dim,
         | 
| 667 | 
            +
                    gin_channels,
         | 
| 668 | 
            +
                    sr,
         | 
| 669 | 
            +
                    **kwargs
         | 
| 670 | 
            +
                ):
         | 
| 671 | 
            +
                    super().__init__()
         | 
| 672 | 
            +
                    if type(sr) == type("strr"):
         | 
| 673 | 
            +
                        sr = sr2sr[sr]
         | 
| 674 | 
            +
                    self.spec_channels = spec_channels
         | 
| 675 | 
            +
                    self.inter_channels = inter_channels
         | 
| 676 | 
            +
                    self.hidden_channels = hidden_channels
         | 
| 677 | 
            +
                    self.filter_channels = filter_channels
         | 
| 678 | 
            +
                    self.n_heads = n_heads
         | 
| 679 | 
            +
                    self.n_layers = n_layers
         | 
| 680 | 
            +
                    self.kernel_size = kernel_size
         | 
| 681 | 
            +
                    self.p_dropout = p_dropout
         | 
| 682 | 
            +
                    self.resblock = resblock
         | 
| 683 | 
            +
                    self.resblock_kernel_sizes = resblock_kernel_sizes
         | 
| 684 | 
            +
                    self.resblock_dilation_sizes = resblock_dilation_sizes
         | 
| 685 | 
            +
                    self.upsample_rates = upsample_rates
         | 
| 686 | 
            +
                    self.upsample_initial_channel = upsample_initial_channel
         | 
| 687 | 
            +
                    self.upsample_kernel_sizes = upsample_kernel_sizes
         | 
| 688 | 
            +
                    self.segment_size = segment_size
         | 
| 689 | 
            +
                    self.gin_channels = gin_channels
         | 
| 690 | 
            +
                    # self.hop_length = hop_length#
         | 
| 691 | 
            +
                    self.spk_embed_dim = spk_embed_dim
         | 
| 692 | 
            +
                    self.enc_p = TextEncoder768(
         | 
| 693 | 
            +
                        inter_channels,
         | 
| 694 | 
            +
                        hidden_channels,
         | 
| 695 | 
            +
                        filter_channels,
         | 
| 696 | 
            +
                        n_heads,
         | 
| 697 | 
            +
                        n_layers,
         | 
| 698 | 
            +
                        kernel_size,
         | 
| 699 | 
            +
                        p_dropout,
         | 
| 700 | 
            +
                    )
         | 
| 701 | 
            +
                    self.dec = GeneratorNSF(
         | 
| 702 | 
            +
                        inter_channels,
         | 
| 703 | 
            +
                        resblock,
         | 
| 704 | 
            +
                        resblock_kernel_sizes,
         | 
| 705 | 
            +
                        resblock_dilation_sizes,
         | 
| 706 | 
            +
                        upsample_rates,
         | 
| 707 | 
            +
                        upsample_initial_channel,
         | 
| 708 | 
            +
                        upsample_kernel_sizes,
         | 
| 709 | 
            +
                        gin_channels=gin_channels,
         | 
| 710 | 
            +
                        sr=sr,
         | 
| 711 | 
            +
                        is_half=kwargs["is_half"],
         | 
| 712 | 
            +
                    )
         | 
| 713 | 
            +
                    self.enc_q = PosteriorEncoder(
         | 
| 714 | 
            +
                        spec_channels,
         | 
| 715 | 
            +
                        inter_channels,
         | 
| 716 | 
            +
                        hidden_channels,
         | 
| 717 | 
            +
                        5,
         | 
| 718 | 
            +
                        1,
         | 
| 719 | 
            +
                        16,
         | 
| 720 | 
            +
                        gin_channels=gin_channels,
         | 
| 721 | 
            +
                    )
         | 
| 722 | 
            +
                    self.flow = ResidualCouplingBlock(
         | 
| 723 | 
            +
                        inter_channels, hidden_channels, 5, 1, 3, gin_channels=gin_channels
         | 
| 724 | 
            +
                    )
         | 
| 725 | 
            +
                    self.emb_g = nn.Embedding(self.spk_embed_dim, gin_channels)
         | 
| 726 | 
            +
                    print("gin_channels:", gin_channels, "self.spk_embed_dim:", self.spk_embed_dim)
         | 
| 727 | 
            +
             | 
| 728 | 
            +
                def remove_weight_norm(self):
         | 
| 729 | 
            +
                    self.dec.remove_weight_norm()
         | 
| 730 | 
            +
                    self.flow.remove_weight_norm()
         | 
| 731 | 
            +
                    self.enc_q.remove_weight_norm()
         | 
| 732 | 
            +
             | 
| 733 | 
            +
                def forward(
         | 
| 734 | 
            +
                    self, phone, phone_lengths, pitch, pitchf, y, y_lengths, ds
         | 
| 735 | 
            +
                ):  # Here ds is id,[bs,1]
         | 
| 736 | 
            +
                    # print(1,pitch.shape)#[bs,t]
         | 
| 737 | 
            +
                    g = self.emb_g(ds).unsqueeze(-1)  # [b, 256, 1]##1 is t, broadcast
         | 
| 738 | 
            +
                    m_p, logs_p, x_mask = self.enc_p(phone, pitch, phone_lengths)
         | 
| 739 | 
            +
                    z, m_q, logs_q, y_mask = self.enc_q(y, y_lengths, g=g)
         | 
| 740 | 
            +
                    z_p = self.flow(z, y_mask, g=g)
         | 
| 741 | 
            +
                    z_slice, ids_slice = commons.rand_slice_segments(
         | 
| 742 | 
            +
                        z, y_lengths, self.segment_size
         | 
| 743 | 
            +
                    )
         | 
| 744 | 
            +
                    # print(-1,pitchf.shape,ids_slice,self.segment_size,self.hop_length,self.segment_size//self.hop_length)
         | 
| 745 | 
            +
                    pitchf = commons.slice_segments2(pitchf, ids_slice, self.segment_size)
         | 
| 746 | 
            +
                    # print(-2,pitchf.shape,z_slice.shape)
         | 
| 747 | 
            +
                    o = self.dec(z_slice, pitchf, g=g)
         | 
| 748 | 
            +
                    return o, ids_slice, x_mask, y_mask, (z, z_p, m_p, logs_p, m_q, logs_q)
         | 
| 749 | 
            +
             | 
| 750 | 
            +
                def infer(self, phone, phone_lengths, pitch, nsff0, sid, rate=None):
         | 
| 751 | 
            +
                    g = self.emb_g(sid).unsqueeze(-1)
         | 
| 752 | 
            +
                    m_p, logs_p, x_mask = self.enc_p(phone, pitch, phone_lengths)
         | 
| 753 | 
            +
                    z_p = (m_p + torch.exp(logs_p) * torch.randn_like(m_p) * 0.66666) * x_mask
         | 
| 754 | 
            +
                    if rate:
         | 
| 755 | 
            +
                        head = int(z_p.shape[2] * rate)
         | 
| 756 | 
            +
                        z_p = z_p[:, :, -head:]
         | 
| 757 | 
            +
                        x_mask = x_mask[:, :, -head:]
         | 
| 758 | 
            +
                        nsff0 = nsff0[:, -head:]
         | 
| 759 | 
            +
                    z = self.flow(z_p, x_mask, g=g, reverse=True)
         | 
| 760 | 
            +
                    o = self.dec(z * x_mask, nsff0, g=g)
         | 
| 761 | 
            +
                    return o, x_mask, (z, z_p, m_p, logs_p)
         | 
| 762 | 
            +
             | 
| 763 | 
            +
             | 
| 764 | 
            +
            class SynthesizerTrnMs256NSFsid_nono(nn.Module):
         | 
| 765 | 
            +
                def __init__(
         | 
| 766 | 
            +
                    self,
         | 
| 767 | 
            +
                    spec_channels,
         | 
| 768 | 
            +
                    segment_size,
         | 
| 769 | 
            +
                    inter_channels,
         | 
| 770 | 
            +
                    hidden_channels,
         | 
| 771 | 
            +
                    filter_channels,
         | 
| 772 | 
            +
                    n_heads,
         | 
| 773 | 
            +
                    n_layers,
         | 
| 774 | 
            +
                    kernel_size,
         | 
| 775 | 
            +
                    p_dropout,
         | 
| 776 | 
            +
                    resblock,
         | 
| 777 | 
            +
                    resblock_kernel_sizes,
         | 
| 778 | 
            +
                    resblock_dilation_sizes,
         | 
| 779 | 
            +
                    upsample_rates,
         | 
| 780 | 
            +
                    upsample_initial_channel,
         | 
| 781 | 
            +
                    upsample_kernel_sizes,
         | 
| 782 | 
            +
                    spk_embed_dim,
         | 
| 783 | 
            +
                    gin_channels,
         | 
| 784 | 
            +
                    sr=None,
         | 
| 785 | 
            +
                    **kwargs
         | 
| 786 | 
            +
                ):
         | 
| 787 | 
            +
                    super().__init__()
         | 
| 788 | 
            +
                    self.spec_channels = spec_channels
         | 
| 789 | 
            +
                    self.inter_channels = inter_channels
         | 
| 790 | 
            +
                    self.hidden_channels = hidden_channels
         | 
| 791 | 
            +
                    self.filter_channels = filter_channels
         | 
| 792 | 
            +
                    self.n_heads = n_heads
         | 
| 793 | 
            +
                    self.n_layers = n_layers
         | 
| 794 | 
            +
                    self.kernel_size = kernel_size
         | 
| 795 | 
            +
                    self.p_dropout = p_dropout
         | 
| 796 | 
            +
                    self.resblock = resblock
         | 
| 797 | 
            +
                    self.resblock_kernel_sizes = resblock_kernel_sizes
         | 
| 798 | 
            +
                    self.resblock_dilation_sizes = resblock_dilation_sizes
         | 
| 799 | 
            +
                    self.upsample_rates = upsample_rates
         | 
| 800 | 
            +
                    self.upsample_initial_channel = upsample_initial_channel
         | 
| 801 | 
            +
                    self.upsample_kernel_sizes = upsample_kernel_sizes
         | 
| 802 | 
            +
                    self.segment_size = segment_size
         | 
| 803 | 
            +
                    self.gin_channels = gin_channels
         | 
| 804 | 
            +
                    # self.hop_length = hop_length#
         | 
| 805 | 
            +
                    self.spk_embed_dim = spk_embed_dim
         | 
| 806 | 
            +
                    self.enc_p = TextEncoder256(
         | 
| 807 | 
            +
                        inter_channels,
         | 
| 808 | 
            +
                        hidden_channels,
         | 
| 809 | 
            +
                        filter_channels,
         | 
| 810 | 
            +
                        n_heads,
         | 
| 811 | 
            +
                        n_layers,
         | 
| 812 | 
            +
                        kernel_size,
         | 
| 813 | 
            +
                        p_dropout,
         | 
| 814 | 
            +
                        f0=False,
         | 
| 815 | 
            +
                    )
         | 
| 816 | 
            +
                    self.dec = Generator(
         | 
| 817 | 
            +
                        inter_channels,
         | 
| 818 | 
            +
                        resblock,
         | 
| 819 | 
            +
                        resblock_kernel_sizes,
         | 
| 820 | 
            +
                        resblock_dilation_sizes,
         | 
| 821 | 
            +
                        upsample_rates,
         | 
| 822 | 
            +
                        upsample_initial_channel,
         | 
| 823 | 
            +
                        upsample_kernel_sizes,
         | 
| 824 | 
            +
                        gin_channels=gin_channels,
         | 
| 825 | 
            +
                    )
         | 
| 826 | 
            +
                    self.enc_q = PosteriorEncoder(
         | 
| 827 | 
            +
                        spec_channels,
         | 
| 828 | 
            +
                        inter_channels,
         | 
| 829 | 
            +
                        hidden_channels,
         | 
| 830 | 
            +
                        5,
         | 
| 831 | 
            +
                        1,
         | 
| 832 | 
            +
                        16,
         | 
| 833 | 
            +
                        gin_channels=gin_channels,
         | 
| 834 | 
            +
                    )
         | 
| 835 | 
            +
                    self.flow = ResidualCouplingBlock(
         | 
| 836 | 
            +
                        inter_channels, hidden_channels, 5, 1, 3, gin_channels=gin_channels
         | 
| 837 | 
            +
                    )
         | 
| 838 | 
            +
                    self.emb_g = nn.Embedding(self.spk_embed_dim, gin_channels)
         | 
| 839 | 
            +
                    print("gin_channels:", gin_channels, "self.spk_embed_dim:", self.spk_embed_dim)
         | 
| 840 | 
            +
             | 
| 841 | 
            +
                def remove_weight_norm(self):
         | 
| 842 | 
            +
                    self.dec.remove_weight_norm()
         | 
| 843 | 
            +
                    self.flow.remove_weight_norm()
         | 
| 844 | 
            +
                    self.enc_q.remove_weight_norm()
         | 
| 845 | 
            +
             | 
| 846 | 
            +
                def forward(self, phone, phone_lengths, y, y_lengths, ds):  # Here ds is id,[bs,1]
         | 
| 847 | 
            +
                    g = self.emb_g(ds).unsqueeze(-1)  # [b, 256, 1]##1 is t, broadcast
         | 
| 848 | 
            +
                    m_p, logs_p, x_mask = self.enc_p(phone, None, phone_lengths)
         | 
| 849 | 
            +
                    z, m_q, logs_q, y_mask = self.enc_q(y, y_lengths, g=g)
         | 
| 850 | 
            +
                    z_p = self.flow(z, y_mask, g=g)
         | 
| 851 | 
            +
                    z_slice, ids_slice = commons.rand_slice_segments(
         | 
| 852 | 
            +
                        z, y_lengths, self.segment_size
         | 
| 853 | 
            +
                    )
         | 
| 854 | 
            +
                    o = self.dec(z_slice, g=g)
         | 
| 855 | 
            +
                    return o, ids_slice, x_mask, y_mask, (z, z_p, m_p, logs_p, m_q, logs_q)
         | 
| 856 | 
            +
             | 
| 857 | 
            +
                def infer(self, phone, phone_lengths, sid, rate=None):
         | 
| 858 | 
            +
                    g = self.emb_g(sid).unsqueeze(-1)
         | 
| 859 | 
            +
                    m_p, logs_p, x_mask = self.enc_p(phone, None, phone_lengths)
         | 
| 860 | 
            +
                    z_p = (m_p + torch.exp(logs_p) * torch.randn_like(m_p) * 0.66666) * x_mask
         | 
| 861 | 
            +
                    if rate:
         | 
| 862 | 
            +
                        head = int(z_p.shape[2] * rate)
         | 
| 863 | 
            +
                        z_p = z_p[:, :, -head:]
         | 
| 864 | 
            +
                        x_mask = x_mask[:, :, -head:]
         | 
| 865 | 
            +
                    z = self.flow(z_p, x_mask, g=g, reverse=True)
         | 
| 866 | 
            +
                    o = self.dec(z * x_mask, g=g)
         | 
| 867 | 
            +
                    return o, x_mask, (z, z_p, m_p, logs_p)
         | 
| 868 | 
            +
             | 
| 869 | 
            +
             | 
| 870 | 
            +
            class SynthesizerTrnMs768NSFsid_nono(nn.Module):
         | 
| 871 | 
            +
                def __init__(
         | 
| 872 | 
            +
                    self,
         | 
| 873 | 
            +
                    spec_channels,
         | 
| 874 | 
            +
                    segment_size,
         | 
| 875 | 
            +
                    inter_channels,
         | 
| 876 | 
            +
                    hidden_channels,
         | 
| 877 | 
            +
                    filter_channels,
         | 
| 878 | 
            +
                    n_heads,
         | 
| 879 | 
            +
                    n_layers,
         | 
| 880 | 
            +
                    kernel_size,
         | 
| 881 | 
            +
                    p_dropout,
         | 
| 882 | 
            +
                    resblock,
         | 
| 883 | 
            +
                    resblock_kernel_sizes,
         | 
| 884 | 
            +
                    resblock_dilation_sizes,
         | 
| 885 | 
            +
                    upsample_rates,
         | 
| 886 | 
            +
                    upsample_initial_channel,
         | 
| 887 | 
            +
                    upsample_kernel_sizes,
         | 
| 888 | 
            +
                    spk_embed_dim,
         | 
| 889 | 
            +
                    gin_channels,
         | 
| 890 | 
            +
                    sr=None,
         | 
| 891 | 
            +
                    **kwargs
         | 
| 892 | 
            +
                ):
         | 
| 893 | 
            +
                    super().__init__()
         | 
| 894 | 
            +
                    self.spec_channels = spec_channels
         | 
| 895 | 
            +
                    self.inter_channels = inter_channels
         | 
| 896 | 
            +
                    self.hidden_channels = hidden_channels
         | 
| 897 | 
            +
                    self.filter_channels = filter_channels
         | 
| 898 | 
            +
                    self.n_heads = n_heads
         | 
| 899 | 
            +
                    self.n_layers = n_layers
         | 
| 900 | 
            +
                    self.kernel_size = kernel_size
         | 
| 901 | 
            +
                    self.p_dropout = p_dropout
         | 
| 902 | 
            +
                    self.resblock = resblock
         | 
| 903 | 
            +
                    self.resblock_kernel_sizes = resblock_kernel_sizes
         | 
| 904 | 
            +
                    self.resblock_dilation_sizes = resblock_dilation_sizes
         | 
| 905 | 
            +
                    self.upsample_rates = upsample_rates
         | 
| 906 | 
            +
                    self.upsample_initial_channel = upsample_initial_channel
         | 
| 907 | 
            +
                    self.upsample_kernel_sizes = upsample_kernel_sizes
         | 
| 908 | 
            +
                    self.segment_size = segment_size
         | 
| 909 | 
            +
                    self.gin_channels = gin_channels
         | 
| 910 | 
            +
                    # self.hop_length = hop_length#
         | 
| 911 | 
            +
                    self.spk_embed_dim = spk_embed_dim
         | 
| 912 | 
            +
                    self.enc_p = TextEncoder768(
         | 
| 913 | 
            +
                        inter_channels,
         | 
| 914 | 
            +
                        hidden_channels,
         | 
| 915 | 
            +
                        filter_channels,
         | 
| 916 | 
            +
                        n_heads,
         | 
| 917 | 
            +
                        n_layers,
         | 
| 918 | 
            +
                        kernel_size,
         | 
| 919 | 
            +
                        p_dropout,
         | 
| 920 | 
            +
                        f0=False,
         | 
| 921 | 
            +
                    )
         | 
| 922 | 
            +
                    self.dec = Generator(
         | 
| 923 | 
            +
                        inter_channels,
         | 
| 924 | 
            +
                        resblock,
         | 
| 925 | 
            +
                        resblock_kernel_sizes,
         | 
| 926 | 
            +
                        resblock_dilation_sizes,
         | 
| 927 | 
            +
                        upsample_rates,
         | 
| 928 | 
            +
                        upsample_initial_channel,
         | 
| 929 | 
            +
                        upsample_kernel_sizes,
         | 
| 930 | 
            +
                        gin_channels=gin_channels,
         | 
| 931 | 
            +
                    )
         | 
| 932 | 
            +
                    self.enc_q = PosteriorEncoder(
         | 
| 933 | 
            +
                        spec_channels,
         | 
| 934 | 
            +
                        inter_channels,
         | 
| 935 | 
            +
                        hidden_channels,
         | 
| 936 | 
            +
                        5,
         | 
| 937 | 
            +
                        1,
         | 
| 938 | 
            +
                        16,
         | 
| 939 | 
            +
                        gin_channels=gin_channels,
         | 
| 940 | 
            +
                    )
         | 
| 941 | 
            +
                    self.flow = ResidualCouplingBlock(
         | 
| 942 | 
            +
                        inter_channels, hidden_channels, 5, 1, 3, gin_channels=gin_channels
         | 
| 943 | 
            +
                    )
         | 
| 944 | 
            +
                    self.emb_g = nn.Embedding(self.spk_embed_dim, gin_channels)
         | 
| 945 | 
            +
                    print("gin_channels:", gin_channels, "self.spk_embed_dim:", self.spk_embed_dim)
         | 
| 946 | 
            +
             | 
| 947 | 
            +
                def remove_weight_norm(self):
         | 
| 948 | 
            +
                    self.dec.remove_weight_norm()
         | 
| 949 | 
            +
                    self.flow.remove_weight_norm()
         | 
| 950 | 
            +
                    self.enc_q.remove_weight_norm()
         | 
| 951 | 
            +
             | 
| 952 | 
            +
                def forward(self, phone, phone_lengths, y, y_lengths, ds):  # Here ds is id,[bs,1]
         | 
| 953 | 
            +
                    g = self.emb_g(ds).unsqueeze(-1)  # [b, 256, 1]##1 is t, broadcast
         | 
| 954 | 
            +
                    m_p, logs_p, x_mask = self.enc_p(phone, None, phone_lengths)
         | 
| 955 | 
            +
                    z, m_q, logs_q, y_mask = self.enc_q(y, y_lengths, g=g)
         | 
| 956 | 
            +
                    z_p = self.flow(z, y_mask, g=g)
         | 
| 957 | 
            +
                    z_slice, ids_slice = commons.rand_slice_segments(
         | 
| 958 | 
            +
                        z, y_lengths, self.segment_size
         | 
| 959 | 
            +
                    )
         | 
| 960 | 
            +
                    o = self.dec(z_slice, g=g)
         | 
| 961 | 
            +
                    return o, ids_slice, x_mask, y_mask, (z, z_p, m_p, logs_p, m_q, logs_q)
         | 
| 962 | 
            +
             | 
| 963 | 
            +
                def infer(self, phone, phone_lengths, sid, rate=None):
         | 
| 964 | 
            +
                    g = self.emb_g(sid).unsqueeze(-1)
         | 
| 965 | 
            +
                    m_p, logs_p, x_mask = self.enc_p(phone, None, phone_lengths)
         | 
| 966 | 
            +
                    z_p = (m_p + torch.exp(logs_p) * torch.randn_like(m_p) * 0.66666) * x_mask
         | 
| 967 | 
            +
                    if rate:
         | 
| 968 | 
            +
                        head = int(z_p.shape[2] * rate)
         | 
| 969 | 
            +
                        z_p = z_p[:, :, -head:]
         | 
| 970 | 
            +
                        x_mask = x_mask[:, :, -head:]
         | 
| 971 | 
            +
                    z = self.flow(z_p, x_mask, g=g, reverse=True)
         | 
| 972 | 
            +
                    o = self.dec(z * x_mask, g=g)
         | 
| 973 | 
            +
                    return o, x_mask, (z, z_p, m_p, logs_p)
         | 
| 974 | 
            +
             | 
| 975 | 
            +
             | 
| 976 | 
            +
            class MultiPeriodDiscriminator(torch.nn.Module):
         | 
| 977 | 
            +
                def __init__(self, use_spectral_norm=False):
         | 
| 978 | 
            +
                    super(MultiPeriodDiscriminator, self).__init__()
         | 
| 979 | 
            +
                    periods = [2, 3, 5, 7, 11, 17]
         | 
| 980 | 
            +
                    # periods = [3, 5, 7, 11, 17, 23, 37]
         | 
| 981 | 
            +
             | 
| 982 | 
            +
                    discs = [DiscriminatorS(use_spectral_norm=use_spectral_norm)]
         | 
| 983 | 
            +
                    discs = discs + [
         | 
| 984 | 
            +
                        DiscriminatorP(i, use_spectral_norm=use_spectral_norm) for i in periods
         | 
| 985 | 
            +
                    ]
         | 
| 986 | 
            +
                    self.discriminators = nn.ModuleList(discs)
         | 
| 987 | 
            +
             | 
| 988 | 
            +
                def forward(self, y, y_hat):
         | 
| 989 | 
            +
                    y_d_rs = []  #
         | 
| 990 | 
            +
                    y_d_gs = []
         | 
| 991 | 
            +
                    fmap_rs = []
         | 
| 992 | 
            +
                    fmap_gs = []
         | 
| 993 | 
            +
                    for i, d in enumerate(self.discriminators):
         | 
| 994 | 
            +
                        y_d_r, fmap_r = d(y)
         | 
| 995 | 
            +
                        y_d_g, fmap_g = d(y_hat)
         | 
| 996 | 
            +
                        # for j in range(len(fmap_r)):
         | 
| 997 | 
            +
                        #     print(i,j,y.shape,y_hat.shape,fmap_r[j].shape,fmap_g[j].shape)
         | 
| 998 | 
            +
                        y_d_rs.append(y_d_r)
         | 
| 999 | 
            +
                        y_d_gs.append(y_d_g)
         | 
| 1000 | 
            +
                        fmap_rs.append(fmap_r)
         | 
| 1001 | 
            +
                        fmap_gs.append(fmap_g)
         | 
| 1002 | 
            +
             | 
| 1003 | 
            +
                    return y_d_rs, y_d_gs, fmap_rs, fmap_gs
         | 
| 1004 | 
            +
             | 
| 1005 | 
            +
             | 
| 1006 | 
            +
            class MultiPeriodDiscriminatorV2(torch.nn.Module):
         | 
| 1007 | 
            +
                def __init__(self, use_spectral_norm=False):
         | 
| 1008 | 
            +
                    super(MultiPeriodDiscriminatorV2, self).__init__()
         | 
| 1009 | 
            +
                    # periods = [2, 3, 5, 7, 11, 17]
         | 
| 1010 | 
            +
                    periods = [2, 3, 5, 7, 11, 17, 23, 37]
         | 
| 1011 | 
            +
             | 
| 1012 | 
            +
                    discs = [DiscriminatorS(use_spectral_norm=use_spectral_norm)]
         | 
| 1013 | 
            +
                    discs = discs + [
         | 
| 1014 | 
            +
                        DiscriminatorP(i, use_spectral_norm=use_spectral_norm) for i in periods
         | 
| 1015 | 
            +
                    ]
         | 
| 1016 | 
            +
                    self.discriminators = nn.ModuleList(discs)
         | 
| 1017 | 
            +
             | 
| 1018 | 
            +
                def forward(self, y, y_hat):
         | 
| 1019 | 
            +
                    y_d_rs = []  #
         | 
| 1020 | 
            +
                    y_d_gs = []
         | 
| 1021 | 
            +
                    fmap_rs = []
         | 
| 1022 | 
            +
                    fmap_gs = []
         | 
| 1023 | 
            +
                    for i, d in enumerate(self.discriminators):
         | 
| 1024 | 
            +
                        y_d_r, fmap_r = d(y)
         | 
| 1025 | 
            +
                        y_d_g, fmap_g = d(y_hat)
         | 
| 1026 | 
            +
                        # for j in range(len(fmap_r)):
         | 
| 1027 | 
            +
                        #     print(i,j,y.shape,y_hat.shape,fmap_r[j].shape,fmap_g[j].shape)
         | 
| 1028 | 
            +
                        y_d_rs.append(y_d_r)
         | 
| 1029 | 
            +
                        y_d_gs.append(y_d_g)
         | 
| 1030 | 
            +
                        fmap_rs.append(fmap_r)
         | 
| 1031 | 
            +
                        fmap_gs.append(fmap_g)
         | 
| 1032 | 
            +
             | 
| 1033 | 
            +
                    return y_d_rs, y_d_gs, fmap_rs, fmap_gs
         | 
| 1034 | 
            +
             | 
| 1035 | 
            +
             | 
| 1036 | 
            +
            class DiscriminatorS(torch.nn.Module):
         | 
| 1037 | 
            +
                def __init__(self, use_spectral_norm=False):
         | 
| 1038 | 
            +
                    super(DiscriminatorS, self).__init__()
         | 
| 1039 | 
            +
                    norm_f = weight_norm if use_spectral_norm == False else spectral_norm
         | 
| 1040 | 
            +
                    self.convs = nn.ModuleList(
         | 
| 1041 | 
            +
                        [
         | 
| 1042 | 
            +
                            norm_f(Conv1d(1, 16, 15, 1, padding=7)),
         | 
| 1043 | 
            +
                            norm_f(Conv1d(16, 64, 41, 4, groups=4, padding=20)),
         | 
| 1044 | 
            +
                            norm_f(Conv1d(64, 256, 41, 4, groups=16, padding=20)),
         | 
| 1045 | 
            +
                            norm_f(Conv1d(256, 1024, 41, 4, groups=64, padding=20)),
         | 
| 1046 | 
            +
                            norm_f(Conv1d(1024, 1024, 41, 4, groups=256, padding=20)),
         | 
| 1047 | 
            +
                            norm_f(Conv1d(1024, 1024, 5, 1, padding=2)),
         | 
| 1048 | 
            +
                        ]
         | 
| 1049 | 
            +
                    )
         | 
| 1050 | 
            +
                    self.conv_post = norm_f(Conv1d(1024, 1, 3, 1, padding=1))
         | 
| 1051 | 
            +
             | 
| 1052 | 
            +
                def forward(self, x):
         | 
| 1053 | 
            +
                    fmap = []
         | 
| 1054 | 
            +
             | 
| 1055 | 
            +
                    for l in self.convs:
         | 
| 1056 | 
            +
                        x = l(x)
         | 
| 1057 | 
            +
                        x = F.leaky_relu(x, modules.LRELU_SLOPE)
         | 
| 1058 | 
            +
                        fmap.append(x)
         | 
| 1059 | 
            +
                    x = self.conv_post(x)
         | 
| 1060 | 
            +
                    fmap.append(x)
         | 
| 1061 | 
            +
                    x = torch.flatten(x, 1, -1)
         | 
| 1062 | 
            +
             | 
| 1063 | 
            +
                    return x, fmap
         | 
| 1064 | 
            +
             | 
| 1065 | 
            +
             | 
| 1066 | 
            +
            class DiscriminatorP(torch.nn.Module):
         | 
| 1067 | 
            +
                def __init__(self, period, kernel_size=5, stride=3, use_spectral_norm=False):
         | 
| 1068 | 
            +
                    super(DiscriminatorP, self).__init__()
         | 
| 1069 | 
            +
                    self.period = period
         | 
| 1070 | 
            +
                    self.use_spectral_norm = use_spectral_norm
         | 
| 1071 | 
            +
                    norm_f = weight_norm if use_spectral_norm == False else spectral_norm
         | 
| 1072 | 
            +
                    self.convs = nn.ModuleList(
         | 
| 1073 | 
            +
                        [
         | 
| 1074 | 
            +
                            norm_f(
         | 
| 1075 | 
            +
                                Conv2d(
         | 
| 1076 | 
            +
                                    1,
         | 
| 1077 | 
            +
                                    32,
         | 
| 1078 | 
            +
                                    (kernel_size, 1),
         | 
| 1079 | 
            +
                                    (stride, 1),
         | 
| 1080 | 
            +
                                    padding=(get_padding(kernel_size, 1), 0),
         | 
| 1081 | 
            +
                                )
         | 
| 1082 | 
            +
                            ),
         | 
| 1083 | 
            +
                            norm_f(
         | 
| 1084 | 
            +
                                Conv2d(
         | 
| 1085 | 
            +
                                    32,
         | 
| 1086 | 
            +
                                    128,
         | 
| 1087 | 
            +
                                    (kernel_size, 1),
         | 
| 1088 | 
            +
                                    (stride, 1),
         | 
| 1089 | 
            +
                                    padding=(get_padding(kernel_size, 1), 0),
         | 
| 1090 | 
            +
                                )
         | 
| 1091 | 
            +
                            ),
         | 
| 1092 | 
            +
                            norm_f(
         | 
| 1093 | 
            +
                                Conv2d(
         | 
| 1094 | 
            +
                                    128,
         | 
| 1095 | 
            +
                                    512,
         | 
| 1096 | 
            +
                                    (kernel_size, 1),
         | 
| 1097 | 
            +
                                    (stride, 1),
         | 
| 1098 | 
            +
                                    padding=(get_padding(kernel_size, 1), 0),
         | 
| 1099 | 
            +
                                )
         | 
| 1100 | 
            +
                            ),
         | 
| 1101 | 
            +
                            norm_f(
         | 
| 1102 | 
            +
                                Conv2d(
         | 
| 1103 | 
            +
                                    512,
         | 
| 1104 | 
            +
                                    1024,
         | 
| 1105 | 
            +
                                    (kernel_size, 1),
         | 
| 1106 | 
            +
                                    (stride, 1),
         | 
| 1107 | 
            +
                                    padding=(get_padding(kernel_size, 1), 0),
         | 
| 1108 | 
            +
                                )
         | 
| 1109 | 
            +
                            ),
         | 
| 1110 | 
            +
                            norm_f(
         | 
| 1111 | 
            +
                                Conv2d(
         | 
| 1112 | 
            +
                                    1024,
         | 
| 1113 | 
            +
                                    1024,
         | 
| 1114 | 
            +
                                    (kernel_size, 1),
         | 
| 1115 | 
            +
                                    1,
         | 
| 1116 | 
            +
                                    padding=(get_padding(kernel_size, 1), 0),
         | 
| 1117 | 
            +
                                )
         | 
| 1118 | 
            +
                            ),
         | 
| 1119 | 
            +
                        ]
         | 
| 1120 | 
            +
                    )
         | 
| 1121 | 
            +
                    self.conv_post = norm_f(Conv2d(1024, 1, (3, 1), 1, padding=(1, 0)))
         | 
| 1122 | 
            +
             | 
| 1123 | 
            +
                def forward(self, x):
         | 
| 1124 | 
            +
                    fmap = []
         | 
| 1125 | 
            +
             | 
| 1126 | 
            +
                    # 1d to 2d
         | 
| 1127 | 
            +
                    b, c, t = x.shape
         | 
| 1128 | 
            +
                    if t % self.period != 0:  # pad first
         | 
| 1129 | 
            +
                        n_pad = self.period - (t % self.period)
         | 
| 1130 | 
            +
                        x = F.pad(x, (0, n_pad), "reflect")
         | 
| 1131 | 
            +
                        t = t + n_pad
         | 
| 1132 | 
            +
                    x = x.view(b, c, t // self.period, self.period)
         | 
| 1133 | 
            +
             | 
| 1134 | 
            +
                    for l in self.convs:
         | 
| 1135 | 
            +
                        x = l(x)
         | 
| 1136 | 
            +
                        x = F.leaky_relu(x, modules.LRELU_SLOPE)
         | 
| 1137 | 
            +
                        fmap.append(x)
         | 
| 1138 | 
            +
                    x = self.conv_post(x)
         | 
| 1139 | 
            +
                    fmap.append(x)
         | 
| 1140 | 
            +
                    x = torch.flatten(x, 1, -1)
         | 
| 1141 | 
            +
             | 
| 1142 | 
            +
                    return x, fmap
         | 
    	
        lib/infer_pack/models_dml.py
    ADDED
    
    | @@ -0,0 +1,1124 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            import math, pdb, os
         | 
| 2 | 
            +
            from time import time as ttime
         | 
| 3 | 
            +
            import torch
         | 
| 4 | 
            +
            from torch import nn
         | 
| 5 | 
            +
            from torch.nn import functional as F
         | 
| 6 | 
            +
            from lib.infer_pack import modules
         | 
| 7 | 
            +
            from lib.infer_pack import attentions
         | 
| 8 | 
            +
            from lib.infer_pack import commons
         | 
| 9 | 
            +
            from lib.infer_pack.commons import init_weights, get_padding
         | 
| 10 | 
            +
            from torch.nn import Conv1d, ConvTranspose1d, AvgPool1d, Conv2d
         | 
| 11 | 
            +
            from torch.nn.utils import weight_norm, remove_weight_norm, spectral_norm
         | 
| 12 | 
            +
            from lib.infer_pack.commons import init_weights
         | 
| 13 | 
            +
            import numpy as np
         | 
| 14 | 
            +
            from lib.infer_pack import commons
         | 
| 15 | 
            +
             | 
| 16 | 
            +
             | 
| 17 | 
            +
            class TextEncoder256(nn.Module):
         | 
| 18 | 
            +
                def __init__(
         | 
| 19 | 
            +
                    self,
         | 
| 20 | 
            +
                    out_channels,
         | 
| 21 | 
            +
                    hidden_channels,
         | 
| 22 | 
            +
                    filter_channels,
         | 
| 23 | 
            +
                    n_heads,
         | 
| 24 | 
            +
                    n_layers,
         | 
| 25 | 
            +
                    kernel_size,
         | 
| 26 | 
            +
                    p_dropout,
         | 
| 27 | 
            +
                    f0=True,
         | 
| 28 | 
            +
                ):
         | 
| 29 | 
            +
                    super().__init__()
         | 
| 30 | 
            +
                    self.out_channels = out_channels
         | 
| 31 | 
            +
                    self.hidden_channels = hidden_channels
         | 
| 32 | 
            +
                    self.filter_channels = filter_channels
         | 
| 33 | 
            +
                    self.n_heads = n_heads
         | 
| 34 | 
            +
                    self.n_layers = n_layers
         | 
| 35 | 
            +
                    self.kernel_size = kernel_size
         | 
| 36 | 
            +
                    self.p_dropout = p_dropout
         | 
| 37 | 
            +
                    self.emb_phone = nn.Linear(256, hidden_channels)
         | 
| 38 | 
            +
                    self.lrelu = nn.LeakyReLU(0.1, inplace=True)
         | 
| 39 | 
            +
                    if f0 == True:
         | 
| 40 | 
            +
                        self.emb_pitch = nn.Embedding(256, hidden_channels)  # pitch 256
         | 
| 41 | 
            +
                    self.encoder = attentions.Encoder(
         | 
| 42 | 
            +
                        hidden_channels, filter_channels, n_heads, n_layers, kernel_size, p_dropout
         | 
| 43 | 
            +
                    )
         | 
| 44 | 
            +
                    self.proj = nn.Conv1d(hidden_channels, out_channels * 2, 1)
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                def forward(self, phone, pitch, lengths):
         | 
| 47 | 
            +
                    if pitch == None:
         | 
| 48 | 
            +
                        x = self.emb_phone(phone)
         | 
| 49 | 
            +
                    else:
         | 
| 50 | 
            +
                        x = self.emb_phone(phone) + self.emb_pitch(pitch)
         | 
| 51 | 
            +
                    x = x * math.sqrt(self.hidden_channels)  # [b, t, h]
         | 
| 52 | 
            +
                    x = self.lrelu(x)
         | 
| 53 | 
            +
                    x = torch.transpose(x, 1, -1)  # [b, h, t]
         | 
| 54 | 
            +
                    x_mask = torch.unsqueeze(commons.sequence_mask(lengths, x.size(2)), 1).to(
         | 
| 55 | 
            +
                        x.dtype
         | 
| 56 | 
            +
                    )
         | 
| 57 | 
            +
                    x = self.encoder(x * x_mask, x_mask)
         | 
| 58 | 
            +
                    stats = self.proj(x) * x_mask
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                    m, logs = torch.split(stats, self.out_channels, dim=1)
         | 
| 61 | 
            +
                    return m, logs, x_mask
         | 
| 62 | 
            +
             | 
| 63 | 
            +
             | 
| 64 | 
            +
            class TextEncoder768(nn.Module):
         | 
| 65 | 
            +
                def __init__(
         | 
| 66 | 
            +
                    self,
         | 
| 67 | 
            +
                    out_channels,
         | 
| 68 | 
            +
                    hidden_channels,
         | 
| 69 | 
            +
                    filter_channels,
         | 
| 70 | 
            +
                    n_heads,
         | 
| 71 | 
            +
                    n_layers,
         | 
| 72 | 
            +
                    kernel_size,
         | 
| 73 | 
            +
                    p_dropout,
         | 
| 74 | 
            +
                    f0=True,
         | 
| 75 | 
            +
                ):
         | 
| 76 | 
            +
                    super().__init__()
         | 
| 77 | 
            +
                    self.out_channels = out_channels
         | 
| 78 | 
            +
                    self.hidden_channels = hidden_channels
         | 
| 79 | 
            +
                    self.filter_channels = filter_channels
         | 
| 80 | 
            +
                    self.n_heads = n_heads
         | 
| 81 | 
            +
                    self.n_layers = n_layers
         | 
| 82 | 
            +
                    self.kernel_size = kernel_size
         | 
| 83 | 
            +
                    self.p_dropout = p_dropout
         | 
| 84 | 
            +
                    self.emb_phone = nn.Linear(768, hidden_channels)
         | 
| 85 | 
            +
                    self.lrelu = nn.LeakyReLU(0.1, inplace=True)
         | 
| 86 | 
            +
                    if f0 == True:
         | 
| 87 | 
            +
                        self.emb_pitch = nn.Embedding(256, hidden_channels)  # pitch 256
         | 
| 88 | 
            +
                    self.encoder = attentions.Encoder(
         | 
| 89 | 
            +
                        hidden_channels, filter_channels, n_heads, n_layers, kernel_size, p_dropout
         | 
| 90 | 
            +
                    )
         | 
| 91 | 
            +
                    self.proj = nn.Conv1d(hidden_channels, out_channels * 2, 1)
         | 
| 92 | 
            +
             | 
| 93 | 
            +
                def forward(self, phone, pitch, lengths):
         | 
| 94 | 
            +
                    if pitch == None:
         | 
| 95 | 
            +
                        x = self.emb_phone(phone)
         | 
| 96 | 
            +
                    else:
         | 
| 97 | 
            +
                        x = self.emb_phone(phone) + self.emb_pitch(pitch)
         | 
| 98 | 
            +
                    x = x * math.sqrt(self.hidden_channels)  # [b, t, h]
         | 
| 99 | 
            +
                    x = self.lrelu(x)
         | 
| 100 | 
            +
                    x = torch.transpose(x, 1, -1)  # [b, h, t]
         | 
| 101 | 
            +
                    x_mask = torch.unsqueeze(commons.sequence_mask(lengths, x.size(2)), 1).to(
         | 
| 102 | 
            +
                        x.dtype
         | 
| 103 | 
            +
                    )
         | 
| 104 | 
            +
                    x = self.encoder(x * x_mask, x_mask)
         | 
| 105 | 
            +
                    stats = self.proj(x) * x_mask
         | 
| 106 | 
            +
             | 
| 107 | 
            +
                    m, logs = torch.split(stats, self.out_channels, dim=1)
         | 
| 108 | 
            +
                    return m, logs, x_mask
         | 
| 109 | 
            +
             | 
| 110 | 
            +
             | 
| 111 | 
            +
            class ResidualCouplingBlock(nn.Module):
         | 
| 112 | 
            +
                def __init__(
         | 
| 113 | 
            +
                    self,
         | 
| 114 | 
            +
                    channels,
         | 
| 115 | 
            +
                    hidden_channels,
         | 
| 116 | 
            +
                    kernel_size,
         | 
| 117 | 
            +
                    dilation_rate,
         | 
| 118 | 
            +
                    n_layers,
         | 
| 119 | 
            +
                    n_flows=4,
         | 
| 120 | 
            +
                    gin_channels=0,
         | 
| 121 | 
            +
                ):
         | 
| 122 | 
            +
                    super().__init__()
         | 
| 123 | 
            +
                    self.channels = channels
         | 
| 124 | 
            +
                    self.hidden_channels = hidden_channels
         | 
| 125 | 
            +
                    self.kernel_size = kernel_size
         | 
| 126 | 
            +
                    self.dilation_rate = dilation_rate
         | 
| 127 | 
            +
                    self.n_layers = n_layers
         | 
| 128 | 
            +
                    self.n_flows = n_flows
         | 
| 129 | 
            +
                    self.gin_channels = gin_channels
         | 
| 130 | 
            +
             | 
| 131 | 
            +
                    self.flows = nn.ModuleList()
         | 
| 132 | 
            +
                    for i in range(n_flows):
         | 
| 133 | 
            +
                        self.flows.append(
         | 
| 134 | 
            +
                            modules.ResidualCouplingLayer(
         | 
| 135 | 
            +
                                channels,
         | 
| 136 | 
            +
                                hidden_channels,
         | 
| 137 | 
            +
                                kernel_size,
         | 
| 138 | 
            +
                                dilation_rate,
         | 
| 139 | 
            +
                                n_layers,
         | 
| 140 | 
            +
                                gin_channels=gin_channels,
         | 
| 141 | 
            +
                                mean_only=True,
         | 
| 142 | 
            +
                            )
         | 
| 143 | 
            +
                        )
         | 
| 144 | 
            +
                        self.flows.append(modules.Flip())
         | 
| 145 | 
            +
             | 
| 146 | 
            +
                def forward(self, x, x_mask, g=None, reverse=False):
         | 
| 147 | 
            +
                    if not reverse:
         | 
| 148 | 
            +
                        for flow in self.flows:
         | 
| 149 | 
            +
                            x, _ = flow(x, x_mask, g=g, reverse=reverse)
         | 
| 150 | 
            +
                    else:
         | 
| 151 | 
            +
                        for flow in reversed(self.flows):
         | 
| 152 | 
            +
                            x = flow(x, x_mask, g=g, reverse=reverse)
         | 
| 153 | 
            +
                    return x
         | 
| 154 | 
            +
             | 
| 155 | 
            +
                def remove_weight_norm(self):
         | 
| 156 | 
            +
                    for i in range(self.n_flows):
         | 
| 157 | 
            +
                        self.flows[i * 2].remove_weight_norm()
         | 
| 158 | 
            +
             | 
| 159 | 
            +
             | 
| 160 | 
            +
            class PosteriorEncoder(nn.Module):
         | 
| 161 | 
            +
                def __init__(
         | 
| 162 | 
            +
                    self,
         | 
| 163 | 
            +
                    in_channels,
         | 
| 164 | 
            +
                    out_channels,
         | 
| 165 | 
            +
                    hidden_channels,
         | 
| 166 | 
            +
                    kernel_size,
         | 
| 167 | 
            +
                    dilation_rate,
         | 
| 168 | 
            +
                    n_layers,
         | 
| 169 | 
            +
                    gin_channels=0,
         | 
| 170 | 
            +
                ):
         | 
| 171 | 
            +
                    super().__init__()
         | 
| 172 | 
            +
                    self.in_channels = in_channels
         | 
| 173 | 
            +
                    self.out_channels = out_channels
         | 
| 174 | 
            +
                    self.hidden_channels = hidden_channels
         | 
| 175 | 
            +
                    self.kernel_size = kernel_size
         | 
| 176 | 
            +
                    self.dilation_rate = dilation_rate
         | 
| 177 | 
            +
                    self.n_layers = n_layers
         | 
| 178 | 
            +
                    self.gin_channels = gin_channels
         | 
| 179 | 
            +
             | 
| 180 | 
            +
                    self.pre = nn.Conv1d(in_channels, hidden_channels, 1)
         | 
| 181 | 
            +
                    self.enc = modules.WN(
         | 
| 182 | 
            +
                        hidden_channels,
         | 
| 183 | 
            +
                        kernel_size,
         | 
| 184 | 
            +
                        dilation_rate,
         | 
| 185 | 
            +
                        n_layers,
         | 
| 186 | 
            +
                        gin_channels=gin_channels,
         | 
| 187 | 
            +
                    )
         | 
| 188 | 
            +
                    self.proj = nn.Conv1d(hidden_channels, out_channels * 2, 1)
         | 
| 189 | 
            +
             | 
| 190 | 
            +
                def forward(self, x, x_lengths, g=None):
         | 
| 191 | 
            +
                    x_mask = torch.unsqueeze(commons.sequence_mask(x_lengths, x.size(2)), 1).to(
         | 
| 192 | 
            +
                        x.dtype
         | 
| 193 | 
            +
                    )
         | 
| 194 | 
            +
                    x = self.pre(x) * x_mask
         | 
| 195 | 
            +
                    x = self.enc(x, x_mask, g=g)
         | 
| 196 | 
            +
                    stats = self.proj(x) * x_mask
         | 
| 197 | 
            +
                    m, logs = torch.split(stats, self.out_channels, dim=1)
         | 
| 198 | 
            +
                    z = (m + torch.randn_like(m) * torch.exp(logs)) * x_mask
         | 
| 199 | 
            +
                    return z, m, logs, x_mask
         | 
| 200 | 
            +
             | 
| 201 | 
            +
                def remove_weight_norm(self):
         | 
| 202 | 
            +
                    self.enc.remove_weight_norm()
         | 
| 203 | 
            +
             | 
| 204 | 
            +
             | 
| 205 | 
            +
            class Generator(torch.nn.Module):
         | 
| 206 | 
            +
                def __init__(
         | 
| 207 | 
            +
                    self,
         | 
| 208 | 
            +
                    initial_channel,
         | 
| 209 | 
            +
                    resblock,
         | 
| 210 | 
            +
                    resblock_kernel_sizes,
         | 
| 211 | 
            +
                    resblock_dilation_sizes,
         | 
| 212 | 
            +
                    upsample_rates,
         | 
| 213 | 
            +
                    upsample_initial_channel,
         | 
| 214 | 
            +
                    upsample_kernel_sizes,
         | 
| 215 | 
            +
                    gin_channels=0,
         | 
| 216 | 
            +
                ):
         | 
| 217 | 
            +
                    super(Generator, self).__init__()
         | 
| 218 | 
            +
                    self.num_kernels = len(resblock_kernel_sizes)
         | 
| 219 | 
            +
                    self.num_upsamples = len(upsample_rates)
         | 
| 220 | 
            +
                    self.conv_pre = Conv1d(
         | 
| 221 | 
            +
                        initial_channel, upsample_initial_channel, 7, 1, padding=3
         | 
| 222 | 
            +
                    )
         | 
| 223 | 
            +
                    resblock = modules.ResBlock1 if resblock == "1" else modules.ResBlock2
         | 
| 224 | 
            +
             | 
| 225 | 
            +
                    self.ups = nn.ModuleList()
         | 
| 226 | 
            +
                    for i, (u, k) in enumerate(zip(upsample_rates, upsample_kernel_sizes)):
         | 
| 227 | 
            +
                        self.ups.append(
         | 
| 228 | 
            +
                            weight_norm(
         | 
| 229 | 
            +
                                ConvTranspose1d(
         | 
| 230 | 
            +
                                    upsample_initial_channel // (2**i),
         | 
| 231 | 
            +
                                    upsample_initial_channel // (2 ** (i + 1)),
         | 
| 232 | 
            +
                                    k,
         | 
| 233 | 
            +
                                    u,
         | 
| 234 | 
            +
                                    padding=(k - u) // 2,
         | 
| 235 | 
            +
                                )
         | 
| 236 | 
            +
                            )
         | 
| 237 | 
            +
                        )
         | 
| 238 | 
            +
             | 
| 239 | 
            +
                    self.resblocks = nn.ModuleList()
         | 
| 240 | 
            +
                    for i in range(len(self.ups)):
         | 
| 241 | 
            +
                        ch = upsample_initial_channel // (2 ** (i + 1))
         | 
| 242 | 
            +
                        for j, (k, d) in enumerate(
         | 
| 243 | 
            +
                            zip(resblock_kernel_sizes, resblock_dilation_sizes)
         | 
| 244 | 
            +
                        ):
         | 
| 245 | 
            +
                            self.resblocks.append(resblock(ch, k, d))
         | 
| 246 | 
            +
             | 
| 247 | 
            +
                    self.conv_post = Conv1d(ch, 1, 7, 1, padding=3, bias=False)
         | 
| 248 | 
            +
                    self.ups.apply(init_weights)
         | 
| 249 | 
            +
             | 
| 250 | 
            +
                    if gin_channels != 0:
         | 
| 251 | 
            +
                        self.cond = nn.Conv1d(gin_channels, upsample_initial_channel, 1)
         | 
| 252 | 
            +
             | 
| 253 | 
            +
                def forward(self, x, g=None):
         | 
| 254 | 
            +
                    x = self.conv_pre(x)
         | 
| 255 | 
            +
                    if g is not None:
         | 
| 256 | 
            +
                        x = x + self.cond(g)
         | 
| 257 | 
            +
             | 
| 258 | 
            +
                    for i in range(self.num_upsamples):
         | 
| 259 | 
            +
                        x = F.leaky_relu(x, modules.LRELU_SLOPE)
         | 
| 260 | 
            +
                        x = self.ups[i](x)
         | 
| 261 | 
            +
                        xs = None
         | 
| 262 | 
            +
                        for j in range(self.num_kernels):
         | 
| 263 | 
            +
                            if xs is None:
         | 
| 264 | 
            +
                                xs = self.resblocks[i * self.num_kernels + j](x)
         | 
| 265 | 
            +
                            else:
         | 
| 266 | 
            +
                                xs += self.resblocks[i * self.num_kernels + j](x)
         | 
| 267 | 
            +
                        x = xs / self.num_kernels
         | 
| 268 | 
            +
                    x = F.leaky_relu(x)
         | 
| 269 | 
            +
                    x = self.conv_post(x)
         | 
| 270 | 
            +
                    x = torch.tanh(x)
         | 
| 271 | 
            +
             | 
| 272 | 
            +
                    return x
         | 
| 273 | 
            +
             | 
| 274 | 
            +
                def remove_weight_norm(self):
         | 
| 275 | 
            +
                    for l in self.ups:
         | 
| 276 | 
            +
                        remove_weight_norm(l)
         | 
| 277 | 
            +
                    for l in self.resblocks:
         | 
| 278 | 
            +
                        l.remove_weight_norm()
         | 
| 279 | 
            +
             | 
| 280 | 
            +
             | 
| 281 | 
            +
            class SineGen(torch.nn.Module):
         | 
| 282 | 
            +
                """Definition of sine generator
         | 
| 283 | 
            +
                SineGen(samp_rate, harmonic_num = 0,
         | 
| 284 | 
            +
                        sine_amp = 0.1, noise_std = 0.003,
         | 
| 285 | 
            +
                        voiced_threshold = 0,
         | 
| 286 | 
            +
                        flag_for_pulse=False)
         | 
| 287 | 
            +
                samp_rate: sampling rate in Hz
         | 
| 288 | 
            +
                harmonic_num: number of harmonic overtones (default 0)
         | 
| 289 | 
            +
                sine_amp: amplitude of sine-wavefrom (default 0.1)
         | 
| 290 | 
            +
                noise_std: std of Gaussian noise (default 0.003)
         | 
| 291 | 
            +
                voiced_thoreshold: F0 threshold for U/V classification (default 0)
         | 
| 292 | 
            +
                flag_for_pulse: this SinGen is used inside PulseGen (default False)
         | 
| 293 | 
            +
                Note: when flag_for_pulse is True, the first time step of a voiced
         | 
| 294 | 
            +
                    segment is always sin(np.pi) or cos(0)
         | 
| 295 | 
            +
                """
         | 
| 296 | 
            +
             | 
| 297 | 
            +
                def __init__(
         | 
| 298 | 
            +
                    self,
         | 
| 299 | 
            +
                    samp_rate,
         | 
| 300 | 
            +
                    harmonic_num=0,
         | 
| 301 | 
            +
                    sine_amp=0.1,
         | 
| 302 | 
            +
                    noise_std=0.003,
         | 
| 303 | 
            +
                    voiced_threshold=0,
         | 
| 304 | 
            +
                    flag_for_pulse=False,
         | 
| 305 | 
            +
                ):
         | 
| 306 | 
            +
                    super(SineGen, self).__init__()
         | 
| 307 | 
            +
                    self.sine_amp = sine_amp
         | 
| 308 | 
            +
                    self.noise_std = noise_std
         | 
| 309 | 
            +
                    self.harmonic_num = harmonic_num
         | 
| 310 | 
            +
                    self.dim = self.harmonic_num + 1
         | 
| 311 | 
            +
                    self.sampling_rate = samp_rate
         | 
| 312 | 
            +
                    self.voiced_threshold = voiced_threshold
         | 
| 313 | 
            +
             | 
| 314 | 
            +
                def _f02uv(self, f0):
         | 
| 315 | 
            +
                    # generate uv signal
         | 
| 316 | 
            +
                    uv = torch.ones_like(f0)
         | 
| 317 | 
            +
                    uv = uv * (f0 > self.voiced_threshold)
         | 
| 318 | 
            +
                    return uv.float()
         | 
| 319 | 
            +
             | 
| 320 | 
            +
                def forward(self, f0, upp):
         | 
| 321 | 
            +
                    """sine_tensor, uv = forward(f0)
         | 
| 322 | 
            +
                    input F0: tensor(batchsize=1, length, dim=1)
         | 
| 323 | 
            +
                              f0 for unvoiced steps should be 0
         | 
| 324 | 
            +
                    output sine_tensor: tensor(batchsize=1, length, dim)
         | 
| 325 | 
            +
                    output uv: tensor(batchsize=1, length, 1)
         | 
| 326 | 
            +
                    """
         | 
| 327 | 
            +
                    with torch.no_grad():
         | 
| 328 | 
            +
                        f0 = f0[:, None].transpose(1, 2)
         | 
| 329 | 
            +
                        f0_buf = torch.zeros(f0.shape[0], f0.shape[1], self.dim, device=f0.device)
         | 
| 330 | 
            +
                        # fundamental component
         | 
| 331 | 
            +
                        f0_buf[:, :, 0] = f0[:, :, 0]
         | 
| 332 | 
            +
                        for idx in np.arange(self.harmonic_num):
         | 
| 333 | 
            +
                            f0_buf[:, :, idx + 1] = f0_buf[:, :, 0] * (
         | 
| 334 | 
            +
                                idx + 2
         | 
| 335 | 
            +
                            )  # idx + 2: the (idx+1)-th overtone, (idx+2)-th harmonic
         | 
| 336 | 
            +
                        rad_values = (f0_buf / self.sampling_rate) % 1  ###%1意味着n_har的乘积无法后处理优化
         | 
| 337 | 
            +
                        rand_ini = torch.rand(
         | 
| 338 | 
            +
                            f0_buf.shape[0], f0_buf.shape[2], device=f0_buf.device
         | 
| 339 | 
            +
                        )
         | 
| 340 | 
            +
                        rand_ini[:, 0] = 0
         | 
| 341 | 
            +
                        rad_values[:, 0, :] = rad_values[:, 0, :] + rand_ini
         | 
| 342 | 
            +
                        tmp_over_one = torch.cumsum(rad_values, 1)  # % 1  #####%1意味着后面的cumsum无法再优化
         | 
| 343 | 
            +
                        tmp_over_one *= upp
         | 
| 344 | 
            +
                        tmp_over_one = F.interpolate(
         | 
| 345 | 
            +
                            tmp_over_one.transpose(2, 1),
         | 
| 346 | 
            +
                            scale_factor=upp,
         | 
| 347 | 
            +
                            mode="linear",
         | 
| 348 | 
            +
                            align_corners=True,
         | 
| 349 | 
            +
                        ).transpose(2, 1)
         | 
| 350 | 
            +
                        rad_values = F.interpolate(
         | 
| 351 | 
            +
                            rad_values.transpose(2, 1), scale_factor=upp, mode="nearest"
         | 
| 352 | 
            +
                        ).transpose(
         | 
| 353 | 
            +
                            2, 1
         | 
| 354 | 
            +
                        )  #######
         | 
| 355 | 
            +
                        tmp_over_one %= 1
         | 
| 356 | 
            +
                        tmp_over_one_idx = (tmp_over_one[:, 1:, :] - tmp_over_one[:, :-1, :]) < 0
         | 
| 357 | 
            +
                        cumsum_shift = torch.zeros_like(rad_values)
         | 
| 358 | 
            +
                        cumsum_shift[:, 1:, :] = tmp_over_one_idx * -1.0
         | 
| 359 | 
            +
                        sine_waves = torch.sin(
         | 
| 360 | 
            +
                            torch.cumsum(rad_values + cumsum_shift, dim=1) * 2 * np.pi
         | 
| 361 | 
            +
                        )
         | 
| 362 | 
            +
                        sine_waves = sine_waves * self.sine_amp
         | 
| 363 | 
            +
                        uv = self._f02uv(f0)
         | 
| 364 | 
            +
                        uv = F.interpolate(
         | 
| 365 | 
            +
                            uv.transpose(2, 1), scale_factor=upp, mode="nearest"
         | 
| 366 | 
            +
                        ).transpose(2, 1)
         | 
| 367 | 
            +
                        noise_amp = uv * self.noise_std + (1 - uv) * self.sine_amp / 3
         | 
| 368 | 
            +
                        noise = noise_amp * torch.randn_like(sine_waves)
         | 
| 369 | 
            +
                        sine_waves = sine_waves * uv + noise
         | 
| 370 | 
            +
                    return sine_waves, uv, noise
         | 
| 371 | 
            +
             | 
| 372 | 
            +
             | 
| 373 | 
            +
            class SourceModuleHnNSF(torch.nn.Module):
         | 
| 374 | 
            +
                """SourceModule for hn-nsf
         | 
| 375 | 
            +
                SourceModule(sampling_rate, harmonic_num=0, sine_amp=0.1,
         | 
| 376 | 
            +
                             add_noise_std=0.003, voiced_threshod=0)
         | 
| 377 | 
            +
                sampling_rate: sampling_rate in Hz
         | 
| 378 | 
            +
                harmonic_num: number of harmonic above F0 (default: 0)
         | 
| 379 | 
            +
                sine_amp: amplitude of sine source signal (default: 0.1)
         | 
| 380 | 
            +
                add_noise_std: std of additive Gaussian noise (default: 0.003)
         | 
| 381 | 
            +
                    note that amplitude of noise in unvoiced is decided
         | 
| 382 | 
            +
                    by sine_amp
         | 
| 383 | 
            +
                voiced_threshold: threhold to set U/V given F0 (default: 0)
         | 
| 384 | 
            +
                Sine_source, noise_source = SourceModuleHnNSF(F0_sampled)
         | 
| 385 | 
            +
                F0_sampled (batchsize, length, 1)
         | 
| 386 | 
            +
                Sine_source (batchsize, length, 1)
         | 
| 387 | 
            +
                noise_source (batchsize, length 1)
         | 
| 388 | 
            +
                uv (batchsize, length, 1)
         | 
| 389 | 
            +
                """
         | 
| 390 | 
            +
             | 
| 391 | 
            +
                def __init__(
         | 
| 392 | 
            +
                    self,
         | 
| 393 | 
            +
                    sampling_rate,
         | 
| 394 | 
            +
                    harmonic_num=0,
         | 
| 395 | 
            +
                    sine_amp=0.1,
         | 
| 396 | 
            +
                    add_noise_std=0.003,
         | 
| 397 | 
            +
                    voiced_threshod=0,
         | 
| 398 | 
            +
                    is_half=True,
         | 
| 399 | 
            +
                ):
         | 
| 400 | 
            +
                    super(SourceModuleHnNSF, self).__init__()
         | 
| 401 | 
            +
             | 
| 402 | 
            +
                    self.sine_amp = sine_amp
         | 
| 403 | 
            +
                    self.noise_std = add_noise_std
         | 
| 404 | 
            +
                    self.is_half = is_half
         | 
| 405 | 
            +
                    # to produce sine waveforms
         | 
| 406 | 
            +
                    self.l_sin_gen = SineGen(
         | 
| 407 | 
            +
                        sampling_rate, harmonic_num, sine_amp, add_noise_std, voiced_threshod
         | 
| 408 | 
            +
                    )
         | 
| 409 | 
            +
             | 
| 410 | 
            +
                    # to merge source harmonics into a single excitation
         | 
| 411 | 
            +
                    self.l_linear = torch.nn.Linear(harmonic_num + 1, 1)
         | 
| 412 | 
            +
                    self.l_tanh = torch.nn.Tanh()
         | 
| 413 | 
            +
             | 
| 414 | 
            +
                def forward(self, x, upp=None):
         | 
| 415 | 
            +
                    sine_wavs, uv, _ = self.l_sin_gen(x, upp)
         | 
| 416 | 
            +
                    if self.is_half:
         | 
| 417 | 
            +
                        sine_wavs = sine_wavs.half()
         | 
| 418 | 
            +
                    sine_merge = self.l_tanh(self.l_linear(sine_wavs))
         | 
| 419 | 
            +
                    return sine_merge, None, None  # noise, uv
         | 
| 420 | 
            +
             | 
| 421 | 
            +
             | 
| 422 | 
            +
            class GeneratorNSF(torch.nn.Module):
         | 
| 423 | 
            +
                def __init__(
         | 
| 424 | 
            +
                    self,
         | 
| 425 | 
            +
                    initial_channel,
         | 
| 426 | 
            +
                    resblock,
         | 
| 427 | 
            +
                    resblock_kernel_sizes,
         | 
| 428 | 
            +
                    resblock_dilation_sizes,
         | 
| 429 | 
            +
                    upsample_rates,
         | 
| 430 | 
            +
                    upsample_initial_channel,
         | 
| 431 | 
            +
                    upsample_kernel_sizes,
         | 
| 432 | 
            +
                    gin_channels,
         | 
| 433 | 
            +
                    sr,
         | 
| 434 | 
            +
                    is_half=False,
         | 
| 435 | 
            +
                ):
         | 
| 436 | 
            +
                    super(GeneratorNSF, self).__init__()
         | 
| 437 | 
            +
                    self.num_kernels = len(resblock_kernel_sizes)
         | 
| 438 | 
            +
                    self.num_upsamples = len(upsample_rates)
         | 
| 439 | 
            +
             | 
| 440 | 
            +
                    self.f0_upsamp = torch.nn.Upsample(scale_factor=np.prod(upsample_rates))
         | 
| 441 | 
            +
                    self.m_source = SourceModuleHnNSF(
         | 
| 442 | 
            +
                        sampling_rate=sr, harmonic_num=0, is_half=is_half
         | 
| 443 | 
            +
                    )
         | 
| 444 | 
            +
                    self.noise_convs = nn.ModuleList()
         | 
| 445 | 
            +
                    self.conv_pre = Conv1d(
         | 
| 446 | 
            +
                        initial_channel, upsample_initial_channel, 7, 1, padding=3
         | 
| 447 | 
            +
                    )
         | 
| 448 | 
            +
                    resblock = modules.ResBlock1 if resblock == "1" else modules.ResBlock2
         | 
| 449 | 
            +
             | 
| 450 | 
            +
                    self.ups = nn.ModuleList()
         | 
| 451 | 
            +
                    for i, (u, k) in enumerate(zip(upsample_rates, upsample_kernel_sizes)):
         | 
| 452 | 
            +
                        c_cur = upsample_initial_channel // (2 ** (i + 1))
         | 
| 453 | 
            +
                        self.ups.append(
         | 
| 454 | 
            +
                            weight_norm(
         | 
| 455 | 
            +
                                ConvTranspose1d(
         | 
| 456 | 
            +
                                    upsample_initial_channel // (2**i),
         | 
| 457 | 
            +
                                    upsample_initial_channel // (2 ** (i + 1)),
         | 
| 458 | 
            +
                                    k,
         | 
| 459 | 
            +
                                    u,
         | 
| 460 | 
            +
                                    padding=(k - u) // 2,
         | 
| 461 | 
            +
                                )
         | 
| 462 | 
            +
                            )
         | 
| 463 | 
            +
                        )
         | 
| 464 | 
            +
                        if i + 1 < len(upsample_rates):
         | 
| 465 | 
            +
                            stride_f0 = np.prod(upsample_rates[i + 1 :])
         | 
| 466 | 
            +
                            self.noise_convs.append(
         | 
| 467 | 
            +
                                Conv1d(
         | 
| 468 | 
            +
                                    1,
         | 
| 469 | 
            +
                                    c_cur,
         | 
| 470 | 
            +
                                    kernel_size=stride_f0 * 2,
         | 
| 471 | 
            +
                                    stride=stride_f0,
         | 
| 472 | 
            +
                                    padding=stride_f0 // 2,
         | 
| 473 | 
            +
                                )
         | 
| 474 | 
            +
                            )
         | 
| 475 | 
            +
                        else:
         | 
| 476 | 
            +
                            self.noise_convs.append(Conv1d(1, c_cur, kernel_size=1))
         | 
| 477 | 
            +
             | 
| 478 | 
            +
                    self.resblocks = nn.ModuleList()
         | 
| 479 | 
            +
                    for i in range(len(self.ups)):
         | 
| 480 | 
            +
                        ch = upsample_initial_channel // (2 ** (i + 1))
         | 
| 481 | 
            +
                        for j, (k, d) in enumerate(
         | 
| 482 | 
            +
                            zip(resblock_kernel_sizes, resblock_dilation_sizes)
         | 
| 483 | 
            +
                        ):
         | 
| 484 | 
            +
                            self.resblocks.append(resblock(ch, k, d))
         | 
| 485 | 
            +
             | 
| 486 | 
            +
                    self.conv_post = Conv1d(ch, 1, 7, 1, padding=3, bias=False)
         | 
| 487 | 
            +
                    self.ups.apply(init_weights)
         | 
| 488 | 
            +
             | 
| 489 | 
            +
                    if gin_channels != 0:
         | 
| 490 | 
            +
                        self.cond = nn.Conv1d(gin_channels, upsample_initial_channel, 1)
         | 
| 491 | 
            +
             | 
| 492 | 
            +
                    self.upp = np.prod(upsample_rates)
         | 
| 493 | 
            +
             | 
| 494 | 
            +
                def forward(self, x, f0, g=None):
         | 
| 495 | 
            +
                    har_source, noi_source, uv = self.m_source(f0, self.upp)
         | 
| 496 | 
            +
                    har_source = har_source.transpose(1, 2)
         | 
| 497 | 
            +
                    x = self.conv_pre(x)
         | 
| 498 | 
            +
                    if g is not None:
         | 
| 499 | 
            +
                        x = x + self.cond(g)
         | 
| 500 | 
            +
             | 
| 501 | 
            +
                    for i in range(self.num_upsamples):
         | 
| 502 | 
            +
                        x = F.leaky_relu(x, modules.LRELU_SLOPE)
         | 
| 503 | 
            +
                        x = self.ups[i](x)
         | 
| 504 | 
            +
                        x_source = self.noise_convs[i](har_source)
         | 
| 505 | 
            +
                        x = x + x_source
         | 
| 506 | 
            +
                        xs = None
         | 
| 507 | 
            +
                        for j in range(self.num_kernels):
         | 
| 508 | 
            +
                            if xs is None:
         | 
| 509 | 
            +
                                xs = self.resblocks[i * self.num_kernels + j](x)
         | 
| 510 | 
            +
                            else:
         | 
| 511 | 
            +
                                xs += self.resblocks[i * self.num_kernels + j](x)
         | 
| 512 | 
            +
                        x = xs / self.num_kernels
         | 
| 513 | 
            +
                    x = F.leaky_relu(x)
         | 
| 514 | 
            +
                    x = self.conv_post(x)
         | 
| 515 | 
            +
                    x = torch.tanh(x)
         | 
| 516 | 
            +
                    return x
         | 
| 517 | 
            +
             | 
| 518 | 
            +
                def remove_weight_norm(self):
         | 
| 519 | 
            +
                    for l in self.ups:
         | 
| 520 | 
            +
                        remove_weight_norm(l)
         | 
| 521 | 
            +
                    for l in self.resblocks:
         | 
| 522 | 
            +
                        l.remove_weight_norm()
         | 
| 523 | 
            +
             | 
| 524 | 
            +
             | 
| 525 | 
            +
            sr2sr = {
         | 
| 526 | 
            +
                "32k": 32000,
         | 
| 527 | 
            +
                "40k": 40000,
         | 
| 528 | 
            +
                "48k": 48000,
         | 
| 529 | 
            +
            }
         | 
| 530 | 
            +
             | 
| 531 | 
            +
             | 
| 532 | 
            +
            class SynthesizerTrnMs256NSFsid(nn.Module):
         | 
| 533 | 
            +
                def __init__(
         | 
| 534 | 
            +
                    self,
         | 
| 535 | 
            +
                    spec_channels,
         | 
| 536 | 
            +
                    segment_size,
         | 
| 537 | 
            +
                    inter_channels,
         | 
| 538 | 
            +
                    hidden_channels,
         | 
| 539 | 
            +
                    filter_channels,
         | 
| 540 | 
            +
                    n_heads,
         | 
| 541 | 
            +
                    n_layers,
         | 
| 542 | 
            +
                    kernel_size,
         | 
| 543 | 
            +
                    p_dropout,
         | 
| 544 | 
            +
                    resblock,
         | 
| 545 | 
            +
                    resblock_kernel_sizes,
         | 
| 546 | 
            +
                    resblock_dilation_sizes,
         | 
| 547 | 
            +
                    upsample_rates,
         | 
| 548 | 
            +
                    upsample_initial_channel,
         | 
| 549 | 
            +
                    upsample_kernel_sizes,
         | 
| 550 | 
            +
                    spk_embed_dim,
         | 
| 551 | 
            +
                    gin_channels,
         | 
| 552 | 
            +
                    sr,
         | 
| 553 | 
            +
                    **kwargs
         | 
| 554 | 
            +
                ):
         | 
| 555 | 
            +
                    super().__init__()
         | 
| 556 | 
            +
                    if type(sr) == type("strr"):
         | 
| 557 | 
            +
                        sr = sr2sr[sr]
         | 
| 558 | 
            +
                    self.spec_channels = spec_channels
         | 
| 559 | 
            +
                    self.inter_channels = inter_channels
         | 
| 560 | 
            +
                    self.hidden_channels = hidden_channels
         | 
| 561 | 
            +
                    self.filter_channels = filter_channels
         | 
| 562 | 
            +
                    self.n_heads = n_heads
         | 
| 563 | 
            +
                    self.n_layers = n_layers
         | 
| 564 | 
            +
                    self.kernel_size = kernel_size
         | 
| 565 | 
            +
                    self.p_dropout = p_dropout
         | 
| 566 | 
            +
                    self.resblock = resblock
         | 
| 567 | 
            +
                    self.resblock_kernel_sizes = resblock_kernel_sizes
         | 
| 568 | 
            +
                    self.resblock_dilation_sizes = resblock_dilation_sizes
         | 
| 569 | 
            +
                    self.upsample_rates = upsample_rates
         | 
| 570 | 
            +
                    self.upsample_initial_channel = upsample_initial_channel
         | 
| 571 | 
            +
                    self.upsample_kernel_sizes = upsample_kernel_sizes
         | 
| 572 | 
            +
                    self.segment_size = segment_size
         | 
| 573 | 
            +
                    self.gin_channels = gin_channels
         | 
| 574 | 
            +
                    # self.hop_length = hop_length#
         | 
| 575 | 
            +
                    self.spk_embed_dim = spk_embed_dim
         | 
| 576 | 
            +
                    self.enc_p = TextEncoder256(
         | 
| 577 | 
            +
                        inter_channels,
         | 
| 578 | 
            +
                        hidden_channels,
         | 
| 579 | 
            +
                        filter_channels,
         | 
| 580 | 
            +
                        n_heads,
         | 
| 581 | 
            +
                        n_layers,
         | 
| 582 | 
            +
                        kernel_size,
         | 
| 583 | 
            +
                        p_dropout,
         | 
| 584 | 
            +
                    )
         | 
| 585 | 
            +
                    self.dec = GeneratorNSF(
         | 
| 586 | 
            +
                        inter_channels,
         | 
| 587 | 
            +
                        resblock,
         | 
| 588 | 
            +
                        resblock_kernel_sizes,
         | 
| 589 | 
            +
                        resblock_dilation_sizes,
         | 
| 590 | 
            +
                        upsample_rates,
         | 
| 591 | 
            +
                        upsample_initial_channel,
         | 
| 592 | 
            +
                        upsample_kernel_sizes,
         | 
| 593 | 
            +
                        gin_channels=gin_channels,
         | 
| 594 | 
            +
                        sr=sr,
         | 
| 595 | 
            +
                        is_half=kwargs["is_half"],
         | 
| 596 | 
            +
                    )
         | 
| 597 | 
            +
                    self.enc_q = PosteriorEncoder(
         | 
| 598 | 
            +
                        spec_channels,
         | 
| 599 | 
            +
                        inter_channels,
         | 
| 600 | 
            +
                        hidden_channels,
         | 
| 601 | 
            +
                        5,
         | 
| 602 | 
            +
                        1,
         | 
| 603 | 
            +
                        16,
         | 
| 604 | 
            +
                        gin_channels=gin_channels,
         | 
| 605 | 
            +
                    )
         | 
| 606 | 
            +
                    self.flow = ResidualCouplingBlock(
         | 
| 607 | 
            +
                        inter_channels, hidden_channels, 5, 1, 3, gin_channels=gin_channels
         | 
| 608 | 
            +
                    )
         | 
| 609 | 
            +
                    self.emb_g = nn.Embedding(self.spk_embed_dim, gin_channels)
         | 
| 610 | 
            +
                    print("gin_channels:", gin_channels, "self.spk_embed_dim:", self.spk_embed_dim)
         | 
| 611 | 
            +
             | 
| 612 | 
            +
                def remove_weight_norm(self):
         | 
| 613 | 
            +
                    self.dec.remove_weight_norm()
         | 
| 614 | 
            +
                    self.flow.remove_weight_norm()
         | 
| 615 | 
            +
                    self.enc_q.remove_weight_norm()
         | 
| 616 | 
            +
             | 
| 617 | 
            +
                def forward(
         | 
| 618 | 
            +
                    self, phone, phone_lengths, pitch, pitchf, y, y_lengths, ds
         | 
| 619 | 
            +
                ):  # 这里ds是id,[bs,1]
         | 
| 620 | 
            +
                    # print(1,pitch.shape)#[bs,t]
         | 
| 621 | 
            +
                    g = self.emb_g(ds).unsqueeze(-1)  # [b, 256, 1]##1是t,广播的
         | 
| 622 | 
            +
                    m_p, logs_p, x_mask = self.enc_p(phone, pitch, phone_lengths)
         | 
| 623 | 
            +
                    z, m_q, logs_q, y_mask = self.enc_q(y, y_lengths, g=g)
         | 
| 624 | 
            +
                    z_p = self.flow(z, y_mask, g=g)
         | 
| 625 | 
            +
                    z_slice, ids_slice = commons.rand_slice_segments(
         | 
| 626 | 
            +
                        z, y_lengths, self.segment_size
         | 
| 627 | 
            +
                    )
         | 
| 628 | 
            +
                    # print(-1,pitchf.shape,ids_slice,self.segment_size,self.hop_length,self.segment_size//self.hop_length)
         | 
| 629 | 
            +
                    pitchf = commons.slice_segments2(pitchf, ids_slice, self.segment_size)
         | 
| 630 | 
            +
                    # print(-2,pitchf.shape,z_slice.shape)
         | 
| 631 | 
            +
                    o = self.dec(z_slice, pitchf, g=g)
         | 
| 632 | 
            +
                    return o, ids_slice, x_mask, y_mask, (z, z_p, m_p, logs_p, m_q, logs_q)
         | 
| 633 | 
            +
             | 
| 634 | 
            +
                def infer(self, phone, phone_lengths, pitch, nsff0, sid, max_len=None):
         | 
| 635 | 
            +
                    g = self.emb_g(sid).unsqueeze(-1)
         | 
| 636 | 
            +
                    m_p, logs_p, x_mask = self.enc_p(phone, pitch, phone_lengths)
         | 
| 637 | 
            +
                    z_p = (m_p + torch.exp(logs_p) * torch.randn_like(m_p) * 0.66666) * x_mask
         | 
| 638 | 
            +
                    z = self.flow(z_p, x_mask, g=g, reverse=True)
         | 
| 639 | 
            +
                    o = self.dec((z * x_mask)[:, :, :max_len], nsff0, g=g)
         | 
| 640 | 
            +
                    return o, x_mask, (z, z_p, m_p, logs_p)
         | 
| 641 | 
            +
             | 
| 642 | 
            +
             | 
| 643 | 
            +
            class SynthesizerTrnMs768NSFsid(nn.Module):
         | 
| 644 | 
            +
                def __init__(
         | 
| 645 | 
            +
                    self,
         | 
| 646 | 
            +
                    spec_channels,
         | 
| 647 | 
            +
                    segment_size,
         | 
| 648 | 
            +
                    inter_channels,
         | 
| 649 | 
            +
                    hidden_channels,
         | 
| 650 | 
            +
                    filter_channels,
         | 
| 651 | 
            +
                    n_heads,
         | 
| 652 | 
            +
                    n_layers,
         | 
| 653 | 
            +
                    kernel_size,
         | 
| 654 | 
            +
                    p_dropout,
         | 
| 655 | 
            +
                    resblock,
         | 
| 656 | 
            +
                    resblock_kernel_sizes,
         | 
| 657 | 
            +
                    resblock_dilation_sizes,
         | 
| 658 | 
            +
                    upsample_rates,
         | 
| 659 | 
            +
                    upsample_initial_channel,
         | 
| 660 | 
            +
                    upsample_kernel_sizes,
         | 
| 661 | 
            +
                    spk_embed_dim,
         | 
| 662 | 
            +
                    gin_channels,
         | 
| 663 | 
            +
                    sr,
         | 
| 664 | 
            +
                    **kwargs
         | 
| 665 | 
            +
                ):
         | 
| 666 | 
            +
                    super().__init__()
         | 
| 667 | 
            +
                    if type(sr) == type("strr"):
         | 
| 668 | 
            +
                        sr = sr2sr[sr]
         | 
| 669 | 
            +
                    self.spec_channels = spec_channels
         | 
| 670 | 
            +
                    self.inter_channels = inter_channels
         | 
| 671 | 
            +
                    self.hidden_channels = hidden_channels
         | 
| 672 | 
            +
                    self.filter_channels = filter_channels
         | 
| 673 | 
            +
                    self.n_heads = n_heads
         | 
| 674 | 
            +
                    self.n_layers = n_layers
         | 
| 675 | 
            +
                    self.kernel_size = kernel_size
         | 
| 676 | 
            +
                    self.p_dropout = p_dropout
         | 
| 677 | 
            +
                    self.resblock = resblock
         | 
| 678 | 
            +
                    self.resblock_kernel_sizes = resblock_kernel_sizes
         | 
| 679 | 
            +
                    self.resblock_dilation_sizes = resblock_dilation_sizes
         | 
| 680 | 
            +
                    self.upsample_rates = upsample_rates
         | 
| 681 | 
            +
                    self.upsample_initial_channel = upsample_initial_channel
         | 
| 682 | 
            +
                    self.upsample_kernel_sizes = upsample_kernel_sizes
         | 
| 683 | 
            +
                    self.segment_size = segment_size
         | 
| 684 | 
            +
                    self.gin_channels = gin_channels
         | 
| 685 | 
            +
                    # self.hop_length = hop_length#
         | 
| 686 | 
            +
                    self.spk_embed_dim = spk_embed_dim
         | 
| 687 | 
            +
                    self.enc_p = TextEncoder768(
         | 
| 688 | 
            +
                        inter_channels,
         | 
| 689 | 
            +
                        hidden_channels,
         | 
| 690 | 
            +
                        filter_channels,
         | 
| 691 | 
            +
                        n_heads,
         | 
| 692 | 
            +
                        n_layers,
         | 
| 693 | 
            +
                        kernel_size,
         | 
| 694 | 
            +
                        p_dropout,
         | 
| 695 | 
            +
                    )
         | 
| 696 | 
            +
                    self.dec = GeneratorNSF(
         | 
| 697 | 
            +
                        inter_channels,
         | 
| 698 | 
            +
                        resblock,
         | 
| 699 | 
            +
                        resblock_kernel_sizes,
         | 
| 700 | 
            +
                        resblock_dilation_sizes,
         | 
| 701 | 
            +
                        upsample_rates,
         | 
| 702 | 
            +
                        upsample_initial_channel,
         | 
| 703 | 
            +
                        upsample_kernel_sizes,
         | 
| 704 | 
            +
                        gin_channels=gin_channels,
         | 
| 705 | 
            +
                        sr=sr,
         | 
| 706 | 
            +
                        is_half=kwargs["is_half"],
         | 
| 707 | 
            +
                    )
         | 
| 708 | 
            +
                    self.enc_q = PosteriorEncoder(
         | 
| 709 | 
            +
                        spec_channels,
         | 
| 710 | 
            +
                        inter_channels,
         | 
| 711 | 
            +
                        hidden_channels,
         | 
| 712 | 
            +
                        5,
         | 
| 713 | 
            +
                        1,
         | 
| 714 | 
            +
                        16,
         | 
| 715 | 
            +
                        gin_channels=gin_channels,
         | 
| 716 | 
            +
                    )
         | 
| 717 | 
            +
                    self.flow = ResidualCouplingBlock(
         | 
| 718 | 
            +
                        inter_channels, hidden_channels, 5, 1, 3, gin_channels=gin_channels
         | 
| 719 | 
            +
                    )
         | 
| 720 | 
            +
                    self.emb_g = nn.Embedding(self.spk_embed_dim, gin_channels)
         | 
| 721 | 
            +
                    print("gin_channels:", gin_channels, "self.spk_embed_dim:", self.spk_embed_dim)
         | 
| 722 | 
            +
             | 
| 723 | 
            +
                def remove_weight_norm(self):
         | 
| 724 | 
            +
                    self.dec.remove_weight_norm()
         | 
| 725 | 
            +
                    self.flow.remove_weight_norm()
         | 
| 726 | 
            +
                    self.enc_q.remove_weight_norm()
         | 
| 727 | 
            +
             | 
| 728 | 
            +
                def forward(
         | 
| 729 | 
            +
                    self, phone, phone_lengths, pitch, pitchf, y, y_lengths, ds
         | 
| 730 | 
            +
                ):  # 这里ds是id,[bs,1]
         | 
| 731 | 
            +
                    # print(1,pitch.shape)#[bs,t]
         | 
| 732 | 
            +
                    g = self.emb_g(ds).unsqueeze(-1)  # [b, 256, 1]##1是t,广播的
         | 
| 733 | 
            +
                    m_p, logs_p, x_mask = self.enc_p(phone, pitch, phone_lengths)
         | 
| 734 | 
            +
                    z, m_q, logs_q, y_mask = self.enc_q(y, y_lengths, g=g)
         | 
| 735 | 
            +
                    z_p = self.flow(z, y_mask, g=g)
         | 
| 736 | 
            +
                    z_slice, ids_slice = commons.rand_slice_segments(
         | 
| 737 | 
            +
                        z, y_lengths, self.segment_size
         | 
| 738 | 
            +
                    )
         | 
| 739 | 
            +
                    # print(-1,pitchf.shape,ids_slice,self.segment_size,self.hop_length,self.segment_size//self.hop_length)
         | 
| 740 | 
            +
                    pitchf = commons.slice_segments2(pitchf, ids_slice, self.segment_size)
         | 
| 741 | 
            +
                    # print(-2,pitchf.shape,z_slice.shape)
         | 
| 742 | 
            +
                    o = self.dec(z_slice, pitchf, g=g)
         | 
| 743 | 
            +
                    return o, ids_slice, x_mask, y_mask, (z, z_p, m_p, logs_p, m_q, logs_q)
         | 
| 744 | 
            +
             | 
| 745 | 
            +
                def infer(self, phone, phone_lengths, pitch, nsff0, sid, max_len=None):
         | 
| 746 | 
            +
                    g = self.emb_g(sid).unsqueeze(-1)
         | 
| 747 | 
            +
                    m_p, logs_p, x_mask = self.enc_p(phone, pitch, phone_lengths)
         | 
| 748 | 
            +
                    z_p = (m_p + torch.exp(logs_p) * torch.randn_like(m_p) * 0.66666) * x_mask
         | 
| 749 | 
            +
                    z = self.flow(z_p, x_mask, g=g, reverse=True)
         | 
| 750 | 
            +
                    o = self.dec((z * x_mask)[:, :, :max_len], nsff0, g=g)
         | 
| 751 | 
            +
                    return o, x_mask, (z, z_p, m_p, logs_p)
         | 
| 752 | 
            +
             | 
| 753 | 
            +
             | 
| 754 | 
            +
            class SynthesizerTrnMs256NSFsid_nono(nn.Module):
         | 
| 755 | 
            +
                def __init__(
         | 
| 756 | 
            +
                    self,
         | 
| 757 | 
            +
                    spec_channels,
         | 
| 758 | 
            +
                    segment_size,
         | 
| 759 | 
            +
                    inter_channels,
         | 
| 760 | 
            +
                    hidden_channels,
         | 
| 761 | 
            +
                    filter_channels,
         | 
| 762 | 
            +
                    n_heads,
         | 
| 763 | 
            +
                    n_layers,
         | 
| 764 | 
            +
                    kernel_size,
         | 
| 765 | 
            +
                    p_dropout,
         | 
| 766 | 
            +
                    resblock,
         | 
| 767 | 
            +
                    resblock_kernel_sizes,
         | 
| 768 | 
            +
                    resblock_dilation_sizes,
         | 
| 769 | 
            +
                    upsample_rates,
         | 
| 770 | 
            +
                    upsample_initial_channel,
         | 
| 771 | 
            +
                    upsample_kernel_sizes,
         | 
| 772 | 
            +
                    spk_embed_dim,
         | 
| 773 | 
            +
                    gin_channels,
         | 
| 774 | 
            +
                    sr=None,
         | 
| 775 | 
            +
                    **kwargs
         | 
| 776 | 
            +
                ):
         | 
| 777 | 
            +
                    super().__init__()
         | 
| 778 | 
            +
                    self.spec_channels = spec_channels
         | 
| 779 | 
            +
                    self.inter_channels = inter_channels
         | 
| 780 | 
            +
                    self.hidden_channels = hidden_channels
         | 
| 781 | 
            +
                    self.filter_channels = filter_channels
         | 
| 782 | 
            +
                    self.n_heads = n_heads
         | 
| 783 | 
            +
                    self.n_layers = n_layers
         | 
| 784 | 
            +
                    self.kernel_size = kernel_size
         | 
| 785 | 
            +
                    self.p_dropout = p_dropout
         | 
| 786 | 
            +
                    self.resblock = resblock
         | 
| 787 | 
            +
                    self.resblock_kernel_sizes = resblock_kernel_sizes
         | 
| 788 | 
            +
                    self.resblock_dilation_sizes = resblock_dilation_sizes
         | 
| 789 | 
            +
                    self.upsample_rates = upsample_rates
         | 
| 790 | 
            +
                    self.upsample_initial_channel = upsample_initial_channel
         | 
| 791 | 
            +
                    self.upsample_kernel_sizes = upsample_kernel_sizes
         | 
| 792 | 
            +
                    self.segment_size = segment_size
         | 
| 793 | 
            +
                    self.gin_channels = gin_channels
         | 
| 794 | 
            +
                    # self.hop_length = hop_length#
         | 
| 795 | 
            +
                    self.spk_embed_dim = spk_embed_dim
         | 
| 796 | 
            +
                    self.enc_p = TextEncoder256(
         | 
| 797 | 
            +
                        inter_channels,
         | 
| 798 | 
            +
                        hidden_channels,
         | 
| 799 | 
            +
                        filter_channels,
         | 
| 800 | 
            +
                        n_heads,
         | 
| 801 | 
            +
                        n_layers,
         | 
| 802 | 
            +
                        kernel_size,
         | 
| 803 | 
            +
                        p_dropout,
         | 
| 804 | 
            +
                        f0=False,
         | 
| 805 | 
            +
                    )
         | 
| 806 | 
            +
                    self.dec = Generator(
         | 
| 807 | 
            +
                        inter_channels,
         | 
| 808 | 
            +
                        resblock,
         | 
| 809 | 
            +
                        resblock_kernel_sizes,
         | 
| 810 | 
            +
                        resblock_dilation_sizes,
         | 
| 811 | 
            +
                        upsample_rates,
         | 
| 812 | 
            +
                        upsample_initial_channel,
         | 
| 813 | 
            +
                        upsample_kernel_sizes,
         | 
| 814 | 
            +
                        gin_channels=gin_channels,
         | 
| 815 | 
            +
                    )
         | 
| 816 | 
            +
                    self.enc_q = PosteriorEncoder(
         | 
| 817 | 
            +
                        spec_channels,
         | 
| 818 | 
            +
                        inter_channels,
         | 
| 819 | 
            +
                        hidden_channels,
         | 
| 820 | 
            +
                        5,
         | 
| 821 | 
            +
                        1,
         | 
| 822 | 
            +
                        16,
         | 
| 823 | 
            +
                        gin_channels=gin_channels,
         | 
| 824 | 
            +
                    )
         | 
| 825 | 
            +
                    self.flow = ResidualCouplingBlock(
         | 
| 826 | 
            +
                        inter_channels, hidden_channels, 5, 1, 3, gin_channels=gin_channels
         | 
| 827 | 
            +
                    )
         | 
| 828 | 
            +
                    self.emb_g = nn.Embedding(self.spk_embed_dim, gin_channels)
         | 
| 829 | 
            +
                    print("gin_channels:", gin_channels, "self.spk_embed_dim:", self.spk_embed_dim)
         | 
| 830 | 
            +
             | 
| 831 | 
            +
                def remove_weight_norm(self):
         | 
| 832 | 
            +
                    self.dec.remove_weight_norm()
         | 
| 833 | 
            +
                    self.flow.remove_weight_norm()
         | 
| 834 | 
            +
                    self.enc_q.remove_weight_norm()
         | 
| 835 | 
            +
             | 
| 836 | 
            +
                def forward(self, phone, phone_lengths, y, y_lengths, ds):  # 这里ds是id,[bs,1]
         | 
| 837 | 
            +
                    g = self.emb_g(ds).unsqueeze(-1)  # [b, 256, 1]##1是t,广播的
         | 
| 838 | 
            +
                    m_p, logs_p, x_mask = self.enc_p(phone, None, phone_lengths)
         | 
| 839 | 
            +
                    z, m_q, logs_q, y_mask = self.enc_q(y, y_lengths, g=g)
         | 
| 840 | 
            +
                    z_p = self.flow(z, y_mask, g=g)
         | 
| 841 | 
            +
                    z_slice, ids_slice = commons.rand_slice_segments(
         | 
| 842 | 
            +
                        z, y_lengths, self.segment_size
         | 
| 843 | 
            +
                    )
         | 
| 844 | 
            +
                    o = self.dec(z_slice, g=g)
         | 
| 845 | 
            +
                    return o, ids_slice, x_mask, y_mask, (z, z_p, m_p, logs_p, m_q, logs_q)
         | 
| 846 | 
            +
             | 
| 847 | 
            +
                def infer(self, phone, phone_lengths, sid, max_len=None):
         | 
| 848 | 
            +
                    g = self.emb_g(sid).unsqueeze(-1)
         | 
| 849 | 
            +
                    m_p, logs_p, x_mask = self.enc_p(phone, None, phone_lengths)
         | 
| 850 | 
            +
                    z_p = (m_p + torch.exp(logs_p) * torch.randn_like(m_p) * 0.66666) * x_mask
         | 
| 851 | 
            +
                    z = self.flow(z_p, x_mask, g=g, reverse=True)
         | 
| 852 | 
            +
                    o = self.dec((z * x_mask)[:, :, :max_len], g=g)
         | 
| 853 | 
            +
                    return o, x_mask, (z, z_p, m_p, logs_p)
         | 
| 854 | 
            +
             | 
| 855 | 
            +
             | 
| 856 | 
            +
            class SynthesizerTrnMs768NSFsid_nono(nn.Module):
         | 
| 857 | 
            +
                def __init__(
         | 
| 858 | 
            +
                    self,
         | 
| 859 | 
            +
                    spec_channels,
         | 
| 860 | 
            +
                    segment_size,
         | 
| 861 | 
            +
                    inter_channels,
         | 
| 862 | 
            +
                    hidden_channels,
         | 
| 863 | 
            +
                    filter_channels,
         | 
| 864 | 
            +
                    n_heads,
         | 
| 865 | 
            +
                    n_layers,
         | 
| 866 | 
            +
                    kernel_size,
         | 
| 867 | 
            +
                    p_dropout,
         | 
| 868 | 
            +
                    resblock,
         | 
| 869 | 
            +
                    resblock_kernel_sizes,
         | 
| 870 | 
            +
                    resblock_dilation_sizes,
         | 
| 871 | 
            +
                    upsample_rates,
         | 
| 872 | 
            +
                    upsample_initial_channel,
         | 
| 873 | 
            +
                    upsample_kernel_sizes,
         | 
| 874 | 
            +
                    spk_embed_dim,
         | 
| 875 | 
            +
                    gin_channels,
         | 
| 876 | 
            +
                    sr=None,
         | 
| 877 | 
            +
                    **kwargs
         | 
| 878 | 
            +
                ):
         | 
| 879 | 
            +
                    super().__init__()
         | 
| 880 | 
            +
                    self.spec_channels = spec_channels
         | 
| 881 | 
            +
                    self.inter_channels = inter_channels
         | 
| 882 | 
            +
                    self.hidden_channels = hidden_channels
         | 
| 883 | 
            +
                    self.filter_channels = filter_channels
         | 
| 884 | 
            +
                    self.n_heads = n_heads
         | 
| 885 | 
            +
                    self.n_layers = n_layers
         | 
| 886 | 
            +
                    self.kernel_size = kernel_size
         | 
| 887 | 
            +
                    self.p_dropout = p_dropout
         | 
| 888 | 
            +
                    self.resblock = resblock
         | 
| 889 | 
            +
                    self.resblock_kernel_sizes = resblock_kernel_sizes
         | 
| 890 | 
            +
                    self.resblock_dilation_sizes = resblock_dilation_sizes
         | 
| 891 | 
            +
                    self.upsample_rates = upsample_rates
         | 
| 892 | 
            +
                    self.upsample_initial_channel = upsample_initial_channel
         | 
| 893 | 
            +
                    self.upsample_kernel_sizes = upsample_kernel_sizes
         | 
| 894 | 
            +
                    self.segment_size = segment_size
         | 
| 895 | 
            +
                    self.gin_channels = gin_channels
         | 
| 896 | 
            +
                    # self.hop_length = hop_length#
         | 
| 897 | 
            +
                    self.spk_embed_dim = spk_embed_dim
         | 
| 898 | 
            +
                    self.enc_p = TextEncoder768(
         | 
| 899 | 
            +
                        inter_channels,
         | 
| 900 | 
            +
                        hidden_channels,
         | 
| 901 | 
            +
                        filter_channels,
         | 
| 902 | 
            +
                        n_heads,
         | 
| 903 | 
            +
                        n_layers,
         | 
| 904 | 
            +
                        kernel_size,
         | 
| 905 | 
            +
                        p_dropout,
         | 
| 906 | 
            +
                        f0=False,
         | 
| 907 | 
            +
                    )
         | 
| 908 | 
            +
                    self.dec = Generator(
         | 
| 909 | 
            +
                        inter_channels,
         | 
| 910 | 
            +
                        resblock,
         | 
| 911 | 
            +
                        resblock_kernel_sizes,
         | 
| 912 | 
            +
                        resblock_dilation_sizes,
         | 
| 913 | 
            +
                        upsample_rates,
         | 
| 914 | 
            +
                        upsample_initial_channel,
         | 
| 915 | 
            +
                        upsample_kernel_sizes,
         | 
| 916 | 
            +
                        gin_channels=gin_channels,
         | 
| 917 | 
            +
                    )
         | 
| 918 | 
            +
                    self.enc_q = PosteriorEncoder(
         | 
| 919 | 
            +
                        spec_channels,
         | 
| 920 | 
            +
                        inter_channels,
         | 
| 921 | 
            +
                        hidden_channels,
         | 
| 922 | 
            +
                        5,
         | 
| 923 | 
            +
                        1,
         | 
| 924 | 
            +
                        16,
         | 
| 925 | 
            +
                        gin_channels=gin_channels,
         | 
| 926 | 
            +
                    )
         | 
| 927 | 
            +
                    self.flow = ResidualCouplingBlock(
         | 
| 928 | 
            +
                        inter_channels, hidden_channels, 5, 1, 3, gin_channels=gin_channels
         | 
| 929 | 
            +
                    )
         | 
| 930 | 
            +
                    self.emb_g = nn.Embedding(self.spk_embed_dim, gin_channels)
         | 
| 931 | 
            +
                    print("gin_channels:", gin_channels, "self.spk_embed_dim:", self.spk_embed_dim)
         | 
| 932 | 
            +
             | 
| 933 | 
            +
                def remove_weight_norm(self):
         | 
| 934 | 
            +
                    self.dec.remove_weight_norm()
         | 
| 935 | 
            +
                    self.flow.remove_weight_norm()
         | 
| 936 | 
            +
                    self.enc_q.remove_weight_norm()
         | 
| 937 | 
            +
             | 
| 938 | 
            +
                def forward(self, phone, phone_lengths, y, y_lengths, ds):  # 这里ds是id,[bs,1]
         | 
| 939 | 
            +
                    g = self.emb_g(ds).unsqueeze(-1)  # [b, 256, 1]##1是t,广播的
         | 
| 940 | 
            +
                    m_p, logs_p, x_mask = self.enc_p(phone, None, phone_lengths)
         | 
| 941 | 
            +
                    z, m_q, logs_q, y_mask = self.enc_q(y, y_lengths, g=g)
         | 
| 942 | 
            +
                    z_p = self.flow(z, y_mask, g=g)
         | 
| 943 | 
            +
                    z_slice, ids_slice = commons.rand_slice_segments(
         | 
| 944 | 
            +
                        z, y_lengths, self.segment_size
         | 
| 945 | 
            +
                    )
         | 
| 946 | 
            +
                    o = self.dec(z_slice, g=g)
         | 
| 947 | 
            +
                    return o, ids_slice, x_mask, y_mask, (z, z_p, m_p, logs_p, m_q, logs_q)
         | 
| 948 | 
            +
             | 
| 949 | 
            +
                def infer(self, phone, phone_lengths, sid, max_len=None):
         | 
| 950 | 
            +
                    g = self.emb_g(sid).unsqueeze(-1)
         | 
| 951 | 
            +
                    m_p, logs_p, x_mask = self.enc_p(phone, None, phone_lengths)
         | 
| 952 | 
            +
                    z_p = (m_p + torch.exp(logs_p) * torch.randn_like(m_p) * 0.66666) * x_mask
         | 
| 953 | 
            +
                    z = self.flow(z_p, x_mask, g=g, reverse=True)
         | 
| 954 | 
            +
                    o = self.dec((z * x_mask)[:, :, :max_len], g=g)
         | 
| 955 | 
            +
                    return o, x_mask, (z, z_p, m_p, logs_p)
         | 
| 956 | 
            +
             | 
| 957 | 
            +
             | 
| 958 | 
            +
            class MultiPeriodDiscriminator(torch.nn.Module):
         | 
| 959 | 
            +
                def __init__(self, use_spectral_norm=False):
         | 
| 960 | 
            +
                    super(MultiPeriodDiscriminator, self).__init__()
         | 
| 961 | 
            +
                    periods = [2, 3, 5, 7, 11, 17]
         | 
| 962 | 
            +
                    # periods = [3, 5, 7, 11, 17, 23, 37]
         | 
| 963 | 
            +
             | 
| 964 | 
            +
                    discs = [DiscriminatorS(use_spectral_norm=use_spectral_norm)]
         | 
| 965 | 
            +
                    discs = discs + [
         | 
| 966 | 
            +
                        DiscriminatorP(i, use_spectral_norm=use_spectral_norm) for i in periods
         | 
| 967 | 
            +
                    ]
         | 
| 968 | 
            +
                    self.discriminators = nn.ModuleList(discs)
         | 
| 969 | 
            +
             | 
| 970 | 
            +
                def forward(self, y, y_hat):
         | 
| 971 | 
            +
                    y_d_rs = []  #
         | 
| 972 | 
            +
                    y_d_gs = []
         | 
| 973 | 
            +
                    fmap_rs = []
         | 
| 974 | 
            +
                    fmap_gs = []
         | 
| 975 | 
            +
                    for i, d in enumerate(self.discriminators):
         | 
| 976 | 
            +
                        y_d_r, fmap_r = d(y)
         | 
| 977 | 
            +
                        y_d_g, fmap_g = d(y_hat)
         | 
| 978 | 
            +
                        # for j in range(len(fmap_r)):
         | 
| 979 | 
            +
                        #     print(i,j,y.shape,y_hat.shape,fmap_r[j].shape,fmap_g[j].shape)
         | 
| 980 | 
            +
                        y_d_rs.append(y_d_r)
         | 
| 981 | 
            +
                        y_d_gs.append(y_d_g)
         | 
| 982 | 
            +
                        fmap_rs.append(fmap_r)
         | 
| 983 | 
            +
                        fmap_gs.append(fmap_g)
         | 
| 984 | 
            +
             | 
| 985 | 
            +
                    return y_d_rs, y_d_gs, fmap_rs, fmap_gs
         | 
| 986 | 
            +
             | 
| 987 | 
            +
             | 
| 988 | 
            +
            class MultiPeriodDiscriminatorV2(torch.nn.Module):
         | 
| 989 | 
            +
                def __init__(self, use_spectral_norm=False):
         | 
| 990 | 
            +
                    super(MultiPeriodDiscriminatorV2, self).__init__()
         | 
| 991 | 
            +
                    # periods = [2, 3, 5, 7, 11, 17]
         | 
| 992 | 
            +
                    periods = [2, 3, 5, 7, 11, 17, 23, 37]
         | 
| 993 | 
            +
             | 
| 994 | 
            +
                    discs = [DiscriminatorS(use_spectral_norm=use_spectral_norm)]
         | 
| 995 | 
            +
                    discs = discs + [
         | 
| 996 | 
            +
                        DiscriminatorP(i, use_spectral_norm=use_spectral_norm) for i in periods
         | 
| 997 | 
            +
                    ]
         | 
| 998 | 
            +
                    self.discriminators = nn.ModuleList(discs)
         | 
| 999 | 
            +
             | 
| 1000 | 
            +
                def forward(self, y, y_hat):
         | 
| 1001 | 
            +
                    y_d_rs = []  #
         | 
| 1002 | 
            +
                    y_d_gs = []
         | 
| 1003 | 
            +
                    fmap_rs = []
         | 
| 1004 | 
            +
                    fmap_gs = []
         | 
| 1005 | 
            +
                    for i, d in enumerate(self.discriminators):
         | 
| 1006 | 
            +
                        y_d_r, fmap_r = d(y)
         | 
| 1007 | 
            +
                        y_d_g, fmap_g = d(y_hat)
         | 
| 1008 | 
            +
                        # for j in range(len(fmap_r)):
         | 
| 1009 | 
            +
                        #     print(i,j,y.shape,y_hat.shape,fmap_r[j].shape,fmap_g[j].shape)
         | 
| 1010 | 
            +
                        y_d_rs.append(y_d_r)
         | 
| 1011 | 
            +
                        y_d_gs.append(y_d_g)
         | 
| 1012 | 
            +
                        fmap_rs.append(fmap_r)
         | 
| 1013 | 
            +
                        fmap_gs.append(fmap_g)
         | 
| 1014 | 
            +
             | 
| 1015 | 
            +
                    return y_d_rs, y_d_gs, fmap_rs, fmap_gs
         | 
| 1016 | 
            +
             | 
| 1017 | 
            +
             | 
| 1018 | 
            +
            class DiscriminatorS(torch.nn.Module):
         | 
| 1019 | 
            +
                def __init__(self, use_spectral_norm=False):
         | 
| 1020 | 
            +
                    super(DiscriminatorS, self).__init__()
         | 
| 1021 | 
            +
                    norm_f = weight_norm if use_spectral_norm == False else spectral_norm
         | 
| 1022 | 
            +
                    self.convs = nn.ModuleList(
         | 
| 1023 | 
            +
                        [
         | 
| 1024 | 
            +
                            norm_f(Conv1d(1, 16, 15, 1, padding=7)),
         | 
| 1025 | 
            +
                            norm_f(Conv1d(16, 64, 41, 4, groups=4, padding=20)),
         | 
| 1026 | 
            +
                            norm_f(Conv1d(64, 256, 41, 4, groups=16, padding=20)),
         | 
| 1027 | 
            +
                            norm_f(Conv1d(256, 1024, 41, 4, groups=64, padding=20)),
         | 
| 1028 | 
            +
                            norm_f(Conv1d(1024, 1024, 41, 4, groups=256, padding=20)),
         | 
| 1029 | 
            +
                            norm_f(Conv1d(1024, 1024, 5, 1, padding=2)),
         | 
| 1030 | 
            +
                        ]
         | 
| 1031 | 
            +
                    )
         | 
| 1032 | 
            +
                    self.conv_post = norm_f(Conv1d(1024, 1, 3, 1, padding=1))
         | 
| 1033 | 
            +
             | 
| 1034 | 
            +
                def forward(self, x):
         | 
| 1035 | 
            +
                    fmap = []
         | 
| 1036 | 
            +
             | 
| 1037 | 
            +
                    for l in self.convs:
         | 
| 1038 | 
            +
                        x = l(x)
         | 
| 1039 | 
            +
                        x = F.leaky_relu(x, modules.LRELU_SLOPE)
         | 
| 1040 | 
            +
                        fmap.append(x)
         | 
| 1041 | 
            +
                    x = self.conv_post(x)
         | 
| 1042 | 
            +
                    fmap.append(x)
         | 
| 1043 | 
            +
                    x = torch.flatten(x, 1, -1)
         | 
| 1044 | 
            +
             | 
| 1045 | 
            +
                    return x, fmap
         | 
| 1046 | 
            +
             | 
| 1047 | 
            +
             | 
| 1048 | 
            +
            class DiscriminatorP(torch.nn.Module):
         | 
| 1049 | 
            +
                def __init__(self, period, kernel_size=5, stride=3, use_spectral_norm=False):
         | 
| 1050 | 
            +
                    super(DiscriminatorP, self).__init__()
         | 
| 1051 | 
            +
                    self.period = period
         | 
| 1052 | 
            +
                    self.use_spectral_norm = use_spectral_norm
         | 
| 1053 | 
            +
                    norm_f = weight_norm if use_spectral_norm == False else spectral_norm
         | 
| 1054 | 
            +
                    self.convs = nn.ModuleList(
         | 
| 1055 | 
            +
                        [
         | 
| 1056 | 
            +
                            norm_f(
         | 
| 1057 | 
            +
                                Conv2d(
         | 
| 1058 | 
            +
                                    1,
         | 
| 1059 | 
            +
                                    32,
         | 
| 1060 | 
            +
                                    (kernel_size, 1),
         | 
| 1061 | 
            +
                                    (stride, 1),
         | 
| 1062 | 
            +
                                    padding=(get_padding(kernel_size, 1), 0),
         | 
| 1063 | 
            +
                                )
         | 
| 1064 | 
            +
                            ),
         | 
| 1065 | 
            +
                            norm_f(
         | 
| 1066 | 
            +
                                Conv2d(
         | 
| 1067 | 
            +
                                    32,
         | 
| 1068 | 
            +
                                    128,
         | 
| 1069 | 
            +
                                    (kernel_size, 1),
         | 
| 1070 | 
            +
                                    (stride, 1),
         | 
| 1071 | 
            +
                                    padding=(get_padding(kernel_size, 1), 0),
         | 
| 1072 | 
            +
                                )
         | 
| 1073 | 
            +
                            ),
         | 
| 1074 | 
            +
                            norm_f(
         | 
| 1075 | 
            +
                                Conv2d(
         | 
| 1076 | 
            +
                                    128,
         | 
| 1077 | 
            +
                                    512,
         | 
| 1078 | 
            +
                                    (kernel_size, 1),
         | 
| 1079 | 
            +
                                    (stride, 1),
         | 
| 1080 | 
            +
                                    padding=(get_padding(kernel_size, 1), 0),
         | 
| 1081 | 
            +
                                )
         | 
| 1082 | 
            +
                            ),
         | 
| 1083 | 
            +
                            norm_f(
         | 
| 1084 | 
            +
                                Conv2d(
         | 
| 1085 | 
            +
                                    512,
         | 
| 1086 | 
            +
                                    1024,
         | 
| 1087 | 
            +
                                    (kernel_size, 1),
         | 
| 1088 | 
            +
                                    (stride, 1),
         | 
| 1089 | 
            +
                                    padding=(get_padding(kernel_size, 1), 0),
         | 
| 1090 | 
            +
                                )
         | 
| 1091 | 
            +
                            ),
         | 
| 1092 | 
            +
                            norm_f(
         | 
| 1093 | 
            +
                                Conv2d(
         | 
| 1094 | 
            +
                                    1024,
         | 
| 1095 | 
            +
                                    1024,
         | 
| 1096 | 
            +
                                    (kernel_size, 1),
         | 
| 1097 | 
            +
                                    1,
         | 
| 1098 | 
            +
                                    padding=(get_padding(kernel_size, 1), 0),
         | 
| 1099 | 
            +
                                )
         | 
| 1100 | 
            +
                            ),
         | 
| 1101 | 
            +
                        ]
         | 
| 1102 | 
            +
                    )
         | 
| 1103 | 
            +
                    self.conv_post = norm_f(Conv2d(1024, 1, (3, 1), 1, padding=(1, 0)))
         | 
| 1104 | 
            +
             | 
| 1105 | 
            +
                def forward(self, x):
         | 
| 1106 | 
            +
                    fmap = []
         | 
| 1107 | 
            +
             | 
| 1108 | 
            +
                    # 1d to 2d
         | 
| 1109 | 
            +
                    b, c, t = x.shape
         | 
| 1110 | 
            +
                    if t % self.period != 0:  # pad first
         | 
| 1111 | 
            +
                        n_pad = self.period - (t % self.period)
         | 
| 1112 | 
            +
                        x = F.pad(x, (0, n_pad), "reflect")
         | 
| 1113 | 
            +
                        t = t + n_pad
         | 
| 1114 | 
            +
                    x = x.view(b, c, t // self.period, self.period)
         | 
| 1115 | 
            +
             | 
| 1116 | 
            +
                    for l in self.convs:
         | 
| 1117 | 
            +
                        x = l(x)
         | 
| 1118 | 
            +
                        x = F.leaky_relu(x, modules.LRELU_SLOPE)
         | 
| 1119 | 
            +
                        fmap.append(x)
         | 
| 1120 | 
            +
                    x = self.conv_post(x)
         | 
| 1121 | 
            +
                    fmap.append(x)
         | 
| 1122 | 
            +
                    x = torch.flatten(x, 1, -1)
         | 
| 1123 | 
            +
             | 
| 1124 | 
            +
                    return x, fmap
         | 
    	
        lib/infer_pack/models_onnx.py
    ADDED
    
    | @@ -0,0 +1,819 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            import math, pdb, os
         | 
| 2 | 
            +
            from time import time as ttime
         | 
| 3 | 
            +
            import torch
         | 
| 4 | 
            +
            from torch import nn
         | 
| 5 | 
            +
            from torch.nn import functional as F
         | 
| 6 | 
            +
            from lib.infer_pack import modules
         | 
| 7 | 
            +
            from lib.infer_pack import attentions
         | 
| 8 | 
            +
            from lib.infer_pack import commons
         | 
| 9 | 
            +
            from lib.infer_pack.commons import init_weights, get_padding
         | 
| 10 | 
            +
            from torch.nn import Conv1d, ConvTranspose1d, AvgPool1d, Conv2d
         | 
| 11 | 
            +
            from torch.nn.utils import weight_norm, remove_weight_norm, spectral_norm
         | 
| 12 | 
            +
            from lib.infer_pack.commons import init_weights
         | 
| 13 | 
            +
            import numpy as np
         | 
| 14 | 
            +
            from lib.infer_pack import commons
         | 
| 15 | 
            +
             | 
| 16 | 
            +
             | 
| 17 | 
            +
            class TextEncoder256(nn.Module):
         | 
| 18 | 
            +
                def __init__(
         | 
| 19 | 
            +
                    self,
         | 
| 20 | 
            +
                    out_channels,
         | 
| 21 | 
            +
                    hidden_channels,
         | 
| 22 | 
            +
                    filter_channels,
         | 
| 23 | 
            +
                    n_heads,
         | 
| 24 | 
            +
                    n_layers,
         | 
| 25 | 
            +
                    kernel_size,
         | 
| 26 | 
            +
                    p_dropout,
         | 
| 27 | 
            +
                    f0=True,
         | 
| 28 | 
            +
                ):
         | 
| 29 | 
            +
                    super().__init__()
         | 
| 30 | 
            +
                    self.out_channels = out_channels
         | 
| 31 | 
            +
                    self.hidden_channels = hidden_channels
         | 
| 32 | 
            +
                    self.filter_channels = filter_channels
         | 
| 33 | 
            +
                    self.n_heads = n_heads
         | 
| 34 | 
            +
                    self.n_layers = n_layers
         | 
| 35 | 
            +
                    self.kernel_size = kernel_size
         | 
| 36 | 
            +
                    self.p_dropout = p_dropout
         | 
| 37 | 
            +
                    self.emb_phone = nn.Linear(256, hidden_channels)
         | 
| 38 | 
            +
                    self.lrelu = nn.LeakyReLU(0.1, inplace=True)
         | 
| 39 | 
            +
                    if f0 == True:
         | 
| 40 | 
            +
                        self.emb_pitch = nn.Embedding(256, hidden_channels)  # pitch 256
         | 
| 41 | 
            +
                    self.encoder = attentions.Encoder(
         | 
| 42 | 
            +
                        hidden_channels, filter_channels, n_heads, n_layers, kernel_size, p_dropout
         | 
| 43 | 
            +
                    )
         | 
| 44 | 
            +
                    self.proj = nn.Conv1d(hidden_channels, out_channels * 2, 1)
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                def forward(self, phone, pitch, lengths):
         | 
| 47 | 
            +
                    if pitch == None:
         | 
| 48 | 
            +
                        x = self.emb_phone(phone)
         | 
| 49 | 
            +
                    else:
         | 
| 50 | 
            +
                        x = self.emb_phone(phone) + self.emb_pitch(pitch)
         | 
| 51 | 
            +
                    x = x * math.sqrt(self.hidden_channels)  # [b, t, h]
         | 
| 52 | 
            +
                    x = self.lrelu(x)
         | 
| 53 | 
            +
                    x = torch.transpose(x, 1, -1)  # [b, h, t]
         | 
| 54 | 
            +
                    x_mask = torch.unsqueeze(commons.sequence_mask(lengths, x.size(2)), 1).to(
         | 
| 55 | 
            +
                        x.dtype
         | 
| 56 | 
            +
                    )
         | 
| 57 | 
            +
                    x = self.encoder(x * x_mask, x_mask)
         | 
| 58 | 
            +
                    stats = self.proj(x) * x_mask
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                    m, logs = torch.split(stats, self.out_channels, dim=1)
         | 
| 61 | 
            +
                    return m, logs, x_mask
         | 
| 62 | 
            +
             | 
| 63 | 
            +
             | 
| 64 | 
            +
            class TextEncoder768(nn.Module):
         | 
| 65 | 
            +
                def __init__(
         | 
| 66 | 
            +
                    self,
         | 
| 67 | 
            +
                    out_channels,
         | 
| 68 | 
            +
                    hidden_channels,
         | 
| 69 | 
            +
                    filter_channels,
         | 
| 70 | 
            +
                    n_heads,
         | 
| 71 | 
            +
                    n_layers,
         | 
| 72 | 
            +
                    kernel_size,
         | 
| 73 | 
            +
                    p_dropout,
         | 
| 74 | 
            +
                    f0=True,
         | 
| 75 | 
            +
                ):
         | 
| 76 | 
            +
                    super().__init__()
         | 
| 77 | 
            +
                    self.out_channels = out_channels
         | 
| 78 | 
            +
                    self.hidden_channels = hidden_channels
         | 
| 79 | 
            +
                    self.filter_channels = filter_channels
         | 
| 80 | 
            +
                    self.n_heads = n_heads
         | 
| 81 | 
            +
                    self.n_layers = n_layers
         | 
| 82 | 
            +
                    self.kernel_size = kernel_size
         | 
| 83 | 
            +
                    self.p_dropout = p_dropout
         | 
| 84 | 
            +
                    self.emb_phone = nn.Linear(768, hidden_channels)
         | 
| 85 | 
            +
                    self.lrelu = nn.LeakyReLU(0.1, inplace=True)
         | 
| 86 | 
            +
                    if f0 == True:
         | 
| 87 | 
            +
                        self.emb_pitch = nn.Embedding(256, hidden_channels)  # pitch 256
         | 
| 88 | 
            +
                    self.encoder = attentions.Encoder(
         | 
| 89 | 
            +
                        hidden_channels, filter_channels, n_heads, n_layers, kernel_size, p_dropout
         | 
| 90 | 
            +
                    )
         | 
| 91 | 
            +
                    self.proj = nn.Conv1d(hidden_channels, out_channels * 2, 1)
         | 
| 92 | 
            +
             | 
| 93 | 
            +
                def forward(self, phone, pitch, lengths):
         | 
| 94 | 
            +
                    if pitch == None:
         | 
| 95 | 
            +
                        x = self.emb_phone(phone)
         | 
| 96 | 
            +
                    else:
         | 
| 97 | 
            +
                        x = self.emb_phone(phone) + self.emb_pitch(pitch)
         | 
| 98 | 
            +
                    x = x * math.sqrt(self.hidden_channels)  # [b, t, h]
         | 
| 99 | 
            +
                    x = self.lrelu(x)
         | 
| 100 | 
            +
                    x = torch.transpose(x, 1, -1)  # [b, h, t]
         | 
| 101 | 
            +
                    x_mask = torch.unsqueeze(commons.sequence_mask(lengths, x.size(2)), 1).to(
         | 
| 102 | 
            +
                        x.dtype
         | 
| 103 | 
            +
                    )
         | 
| 104 | 
            +
                    x = self.encoder(x * x_mask, x_mask)
         | 
| 105 | 
            +
                    stats = self.proj(x) * x_mask
         | 
| 106 | 
            +
             | 
| 107 | 
            +
                    m, logs = torch.split(stats, self.out_channels, dim=1)
         | 
| 108 | 
            +
                    return m, logs, x_mask
         | 
| 109 | 
            +
             | 
| 110 | 
            +
             | 
| 111 | 
            +
            class ResidualCouplingBlock(nn.Module):
         | 
| 112 | 
            +
                def __init__(
         | 
| 113 | 
            +
                    self,
         | 
| 114 | 
            +
                    channels,
         | 
| 115 | 
            +
                    hidden_channels,
         | 
| 116 | 
            +
                    kernel_size,
         | 
| 117 | 
            +
                    dilation_rate,
         | 
| 118 | 
            +
                    n_layers,
         | 
| 119 | 
            +
                    n_flows=4,
         | 
| 120 | 
            +
                    gin_channels=0,
         | 
| 121 | 
            +
                ):
         | 
| 122 | 
            +
                    super().__init__()
         | 
| 123 | 
            +
                    self.channels = channels
         | 
| 124 | 
            +
                    self.hidden_channels = hidden_channels
         | 
| 125 | 
            +
                    self.kernel_size = kernel_size
         | 
| 126 | 
            +
                    self.dilation_rate = dilation_rate
         | 
| 127 | 
            +
                    self.n_layers = n_layers
         | 
| 128 | 
            +
                    self.n_flows = n_flows
         | 
| 129 | 
            +
                    self.gin_channels = gin_channels
         | 
| 130 | 
            +
             | 
| 131 | 
            +
                    self.flows = nn.ModuleList()
         | 
| 132 | 
            +
                    for i in range(n_flows):
         | 
| 133 | 
            +
                        self.flows.append(
         | 
| 134 | 
            +
                            modules.ResidualCouplingLayer(
         | 
| 135 | 
            +
                                channels,
         | 
| 136 | 
            +
                                hidden_channels,
         | 
| 137 | 
            +
                                kernel_size,
         | 
| 138 | 
            +
                                dilation_rate,
         | 
| 139 | 
            +
                                n_layers,
         | 
| 140 | 
            +
                                gin_channels=gin_channels,
         | 
| 141 | 
            +
                                mean_only=True,
         | 
| 142 | 
            +
                            )
         | 
| 143 | 
            +
                        )
         | 
| 144 | 
            +
                        self.flows.append(modules.Flip())
         | 
| 145 | 
            +
             | 
| 146 | 
            +
                def forward(self, x, x_mask, g=None, reverse=False):
         | 
| 147 | 
            +
                    if not reverse:
         | 
| 148 | 
            +
                        for flow in self.flows:
         | 
| 149 | 
            +
                            x, _ = flow(x, x_mask, g=g, reverse=reverse)
         | 
| 150 | 
            +
                    else:
         | 
| 151 | 
            +
                        for flow in reversed(self.flows):
         | 
| 152 | 
            +
                            x = flow(x, x_mask, g=g, reverse=reverse)
         | 
| 153 | 
            +
                    return x
         | 
| 154 | 
            +
             | 
| 155 | 
            +
                def remove_weight_norm(self):
         | 
| 156 | 
            +
                    for i in range(self.n_flows):
         | 
| 157 | 
            +
                        self.flows[i * 2].remove_weight_norm()
         | 
| 158 | 
            +
             | 
| 159 | 
            +
             | 
| 160 | 
            +
            class PosteriorEncoder(nn.Module):
         | 
| 161 | 
            +
                def __init__(
         | 
| 162 | 
            +
                    self,
         | 
| 163 | 
            +
                    in_channels,
         | 
| 164 | 
            +
                    out_channels,
         | 
| 165 | 
            +
                    hidden_channels,
         | 
| 166 | 
            +
                    kernel_size,
         | 
| 167 | 
            +
                    dilation_rate,
         | 
| 168 | 
            +
                    n_layers,
         | 
| 169 | 
            +
                    gin_channels=0,
         | 
| 170 | 
            +
                ):
         | 
| 171 | 
            +
                    super().__init__()
         | 
| 172 | 
            +
                    self.in_channels = in_channels
         | 
| 173 | 
            +
                    self.out_channels = out_channels
         | 
| 174 | 
            +
                    self.hidden_channels = hidden_channels
         | 
| 175 | 
            +
                    self.kernel_size = kernel_size
         | 
| 176 | 
            +
                    self.dilation_rate = dilation_rate
         | 
| 177 | 
            +
                    self.n_layers = n_layers
         | 
| 178 | 
            +
                    self.gin_channels = gin_channels
         | 
| 179 | 
            +
             | 
| 180 | 
            +
                    self.pre = nn.Conv1d(in_channels, hidden_channels, 1)
         | 
| 181 | 
            +
                    self.enc = modules.WN(
         | 
| 182 | 
            +
                        hidden_channels,
         | 
| 183 | 
            +
                        kernel_size,
         | 
| 184 | 
            +
                        dilation_rate,
         | 
| 185 | 
            +
                        n_layers,
         | 
| 186 | 
            +
                        gin_channels=gin_channels,
         | 
| 187 | 
            +
                    )
         | 
| 188 | 
            +
                    self.proj = nn.Conv1d(hidden_channels, out_channels * 2, 1)
         | 
| 189 | 
            +
             | 
| 190 | 
            +
                def forward(self, x, x_lengths, g=None):
         | 
| 191 | 
            +
                    x_mask = torch.unsqueeze(commons.sequence_mask(x_lengths, x.size(2)), 1).to(
         | 
| 192 | 
            +
                        x.dtype
         | 
| 193 | 
            +
                    )
         | 
| 194 | 
            +
                    x = self.pre(x) * x_mask
         | 
| 195 | 
            +
                    x = self.enc(x, x_mask, g=g)
         | 
| 196 | 
            +
                    stats = self.proj(x) * x_mask
         | 
| 197 | 
            +
                    m, logs = torch.split(stats, self.out_channels, dim=1)
         | 
| 198 | 
            +
                    z = (m + torch.randn_like(m) * torch.exp(logs)) * x_mask
         | 
| 199 | 
            +
                    return z, m, logs, x_mask
         | 
| 200 | 
            +
             | 
| 201 | 
            +
                def remove_weight_norm(self):
         | 
| 202 | 
            +
                    self.enc.remove_weight_norm()
         | 
| 203 | 
            +
             | 
| 204 | 
            +
             | 
| 205 | 
            +
            class Generator(torch.nn.Module):
         | 
| 206 | 
            +
                def __init__(
         | 
| 207 | 
            +
                    self,
         | 
| 208 | 
            +
                    initial_channel,
         | 
| 209 | 
            +
                    resblock,
         | 
| 210 | 
            +
                    resblock_kernel_sizes,
         | 
| 211 | 
            +
                    resblock_dilation_sizes,
         | 
| 212 | 
            +
                    upsample_rates,
         | 
| 213 | 
            +
                    upsample_initial_channel,
         | 
| 214 | 
            +
                    upsample_kernel_sizes,
         | 
| 215 | 
            +
                    gin_channels=0,
         | 
| 216 | 
            +
                ):
         | 
| 217 | 
            +
                    super(Generator, self).__init__()
         | 
| 218 | 
            +
                    self.num_kernels = len(resblock_kernel_sizes)
         | 
| 219 | 
            +
                    self.num_upsamples = len(upsample_rates)
         | 
| 220 | 
            +
                    self.conv_pre = Conv1d(
         | 
| 221 | 
            +
                        initial_channel, upsample_initial_channel, 7, 1, padding=3
         | 
| 222 | 
            +
                    )
         | 
| 223 | 
            +
                    resblock = modules.ResBlock1 if resblock == "1" else modules.ResBlock2
         | 
| 224 | 
            +
             | 
| 225 | 
            +
                    self.ups = nn.ModuleList()
         | 
| 226 | 
            +
                    for i, (u, k) in enumerate(zip(upsample_rates, upsample_kernel_sizes)):
         | 
| 227 | 
            +
                        self.ups.append(
         | 
| 228 | 
            +
                            weight_norm(
         | 
| 229 | 
            +
                                ConvTranspose1d(
         | 
| 230 | 
            +
                                    upsample_initial_channel // (2**i),
         | 
| 231 | 
            +
                                    upsample_initial_channel // (2 ** (i + 1)),
         | 
| 232 | 
            +
                                    k,
         | 
| 233 | 
            +
                                    u,
         | 
| 234 | 
            +
                                    padding=(k - u) // 2,
         | 
| 235 | 
            +
                                )
         | 
| 236 | 
            +
                            )
         | 
| 237 | 
            +
                        )
         | 
| 238 | 
            +
             | 
| 239 | 
            +
                    self.resblocks = nn.ModuleList()
         | 
| 240 | 
            +
                    for i in range(len(self.ups)):
         | 
| 241 | 
            +
                        ch = upsample_initial_channel // (2 ** (i + 1))
         | 
| 242 | 
            +
                        for j, (k, d) in enumerate(
         | 
| 243 | 
            +
                            zip(resblock_kernel_sizes, resblock_dilation_sizes)
         | 
| 244 | 
            +
                        ):
         | 
| 245 | 
            +
                            self.resblocks.append(resblock(ch, k, d))
         | 
| 246 | 
            +
             | 
| 247 | 
            +
                    self.conv_post = Conv1d(ch, 1, 7, 1, padding=3, bias=False)
         | 
| 248 | 
            +
                    self.ups.apply(init_weights)
         | 
| 249 | 
            +
             | 
| 250 | 
            +
                    if gin_channels != 0:
         | 
| 251 | 
            +
                        self.cond = nn.Conv1d(gin_channels, upsample_initial_channel, 1)
         | 
| 252 | 
            +
             | 
| 253 | 
            +
                def forward(self, x, g=None):
         | 
| 254 | 
            +
                    x = self.conv_pre(x)
         | 
| 255 | 
            +
                    if g is not None:
         | 
| 256 | 
            +
                        x = x + self.cond(g)
         | 
| 257 | 
            +
             | 
| 258 | 
            +
                    for i in range(self.num_upsamples):
         | 
| 259 | 
            +
                        x = F.leaky_relu(x, modules.LRELU_SLOPE)
         | 
| 260 | 
            +
                        x = self.ups[i](x)
         | 
| 261 | 
            +
                        xs = None
         | 
| 262 | 
            +
                        for j in range(self.num_kernels):
         | 
| 263 | 
            +
                            if xs is None:
         | 
| 264 | 
            +
                                xs = self.resblocks[i * self.num_kernels + j](x)
         | 
| 265 | 
            +
                            else:
         | 
| 266 | 
            +
                                xs += self.resblocks[i * self.num_kernels + j](x)
         | 
| 267 | 
            +
                        x = xs / self.num_kernels
         | 
| 268 | 
            +
                    x = F.leaky_relu(x)
         | 
| 269 | 
            +
                    x = self.conv_post(x)
         | 
| 270 | 
            +
                    x = torch.tanh(x)
         | 
| 271 | 
            +
             | 
| 272 | 
            +
                    return x
         | 
| 273 | 
            +
             | 
| 274 | 
            +
                def remove_weight_norm(self):
         | 
| 275 | 
            +
                    for l in self.ups:
         | 
| 276 | 
            +
                        remove_weight_norm(l)
         | 
| 277 | 
            +
                    for l in self.resblocks:
         | 
| 278 | 
            +
                        l.remove_weight_norm()
         | 
| 279 | 
            +
             | 
| 280 | 
            +
             | 
| 281 | 
            +
            class SineGen(torch.nn.Module):
         | 
| 282 | 
            +
                """Definition of sine generator
         | 
| 283 | 
            +
                SineGen(samp_rate, harmonic_num = 0,
         | 
| 284 | 
            +
                        sine_amp = 0.1, noise_std = 0.003,
         | 
| 285 | 
            +
                        voiced_threshold = 0,
         | 
| 286 | 
            +
                        flag_for_pulse=False)
         | 
| 287 | 
            +
                samp_rate: sampling rate in Hz
         | 
| 288 | 
            +
                harmonic_num: number of harmonic overtones (default 0)
         | 
| 289 | 
            +
                sine_amp: amplitude of sine-wavefrom (default 0.1)
         | 
| 290 | 
            +
                noise_std: std of Gaussian noise (default 0.003)
         | 
| 291 | 
            +
                voiced_thoreshold: F0 threshold for U/V classification (default 0)
         | 
| 292 | 
            +
                flag_for_pulse: this SinGen is used inside PulseGen (default False)
         | 
| 293 | 
            +
                Note: when flag_for_pulse is True, the first time step of a voiced
         | 
| 294 | 
            +
                    segment is always sin(np.pi) or cos(0)
         | 
| 295 | 
            +
                """
         | 
| 296 | 
            +
             | 
| 297 | 
            +
                def __init__(
         | 
| 298 | 
            +
                    self,
         | 
| 299 | 
            +
                    samp_rate,
         | 
| 300 | 
            +
                    harmonic_num=0,
         | 
| 301 | 
            +
                    sine_amp=0.1,
         | 
| 302 | 
            +
                    noise_std=0.003,
         | 
| 303 | 
            +
                    voiced_threshold=0,
         | 
| 304 | 
            +
                    flag_for_pulse=False,
         | 
| 305 | 
            +
                ):
         | 
| 306 | 
            +
                    super(SineGen, self).__init__()
         | 
| 307 | 
            +
                    self.sine_amp = sine_amp
         | 
| 308 | 
            +
                    self.noise_std = noise_std
         | 
| 309 | 
            +
                    self.harmonic_num = harmonic_num
         | 
| 310 | 
            +
                    self.dim = self.harmonic_num + 1
         | 
| 311 | 
            +
                    self.sampling_rate = samp_rate
         | 
| 312 | 
            +
                    self.voiced_threshold = voiced_threshold
         | 
| 313 | 
            +
             | 
| 314 | 
            +
                def _f02uv(self, f0):
         | 
| 315 | 
            +
                    # generate uv signal
         | 
| 316 | 
            +
                    uv = torch.ones_like(f0)
         | 
| 317 | 
            +
                    uv = uv * (f0 > self.voiced_threshold)
         | 
| 318 | 
            +
                    return uv
         | 
| 319 | 
            +
             | 
| 320 | 
            +
                def forward(self, f0, upp):
         | 
| 321 | 
            +
                    """sine_tensor, uv = forward(f0)
         | 
| 322 | 
            +
                    input F0: tensor(batchsize=1, length, dim=1)
         | 
| 323 | 
            +
                              f0 for unvoiced steps should be 0
         | 
| 324 | 
            +
                    output sine_tensor: tensor(batchsize=1, length, dim)
         | 
| 325 | 
            +
                    output uv: tensor(batchsize=1, length, 1)
         | 
| 326 | 
            +
                    """
         | 
| 327 | 
            +
                    with torch.no_grad():
         | 
| 328 | 
            +
                        f0 = f0[:, None].transpose(1, 2)
         | 
| 329 | 
            +
                        f0_buf = torch.zeros(f0.shape[0], f0.shape[1], self.dim, device=f0.device)
         | 
| 330 | 
            +
                        # fundamental component
         | 
| 331 | 
            +
                        f0_buf[:, :, 0] = f0[:, :, 0]
         | 
| 332 | 
            +
                        for idx in np.arange(self.harmonic_num):
         | 
| 333 | 
            +
                            f0_buf[:, :, idx + 1] = f0_buf[:, :, 0] * (
         | 
| 334 | 
            +
                                idx + 2
         | 
| 335 | 
            +
                            )  # idx + 2: the (idx+1)-th overtone, (idx+2)-th harmonic
         | 
| 336 | 
            +
                        rad_values = (f0_buf / self.sampling_rate) % 1  ###%1意味着n_har的乘积无法后处理优化
         | 
| 337 | 
            +
                        rand_ini = torch.rand(
         | 
| 338 | 
            +
                            f0_buf.shape[0], f0_buf.shape[2], device=f0_buf.device
         | 
| 339 | 
            +
                        )
         | 
| 340 | 
            +
                        rand_ini[:, 0] = 0
         | 
| 341 | 
            +
                        rad_values[:, 0, :] = rad_values[:, 0, :] + rand_ini
         | 
| 342 | 
            +
                        tmp_over_one = torch.cumsum(rad_values, 1)  # % 1  #####%1意味着后面的cumsum无法再优化
         | 
| 343 | 
            +
                        tmp_over_one *= upp
         | 
| 344 | 
            +
                        tmp_over_one = F.interpolate(
         | 
| 345 | 
            +
                            tmp_over_one.transpose(2, 1),
         | 
| 346 | 
            +
                            scale_factor=upp,
         | 
| 347 | 
            +
                            mode="linear",
         | 
| 348 | 
            +
                            align_corners=True,
         | 
| 349 | 
            +
                        ).transpose(2, 1)
         | 
| 350 | 
            +
                        rad_values = F.interpolate(
         | 
| 351 | 
            +
                            rad_values.transpose(2, 1), scale_factor=upp, mode="nearest"
         | 
| 352 | 
            +
                        ).transpose(
         | 
| 353 | 
            +
                            2, 1
         | 
| 354 | 
            +
                        )  #######
         | 
| 355 | 
            +
                        tmp_over_one %= 1
         | 
| 356 | 
            +
                        tmp_over_one_idx = (tmp_over_one[:, 1:, :] - tmp_over_one[:, :-1, :]) < 0
         | 
| 357 | 
            +
                        cumsum_shift = torch.zeros_like(rad_values)
         | 
| 358 | 
            +
                        cumsum_shift[:, 1:, :] = tmp_over_one_idx * -1.0
         | 
| 359 | 
            +
                        sine_waves = torch.sin(
         | 
| 360 | 
            +
                            torch.cumsum(rad_values + cumsum_shift, dim=1) * 2 * np.pi
         | 
| 361 | 
            +
                        )
         | 
| 362 | 
            +
                        sine_waves = sine_waves * self.sine_amp
         | 
| 363 | 
            +
                        uv = self._f02uv(f0)
         | 
| 364 | 
            +
                        uv = F.interpolate(
         | 
| 365 | 
            +
                            uv.transpose(2, 1), scale_factor=upp, mode="nearest"
         | 
| 366 | 
            +
                        ).transpose(2, 1)
         | 
| 367 | 
            +
                        noise_amp = uv * self.noise_std + (1 - uv) * self.sine_amp / 3
         | 
| 368 | 
            +
                        noise = noise_amp * torch.randn_like(sine_waves)
         | 
| 369 | 
            +
                        sine_waves = sine_waves * uv + noise
         | 
| 370 | 
            +
                    return sine_waves, uv, noise
         | 
| 371 | 
            +
             | 
| 372 | 
            +
             | 
| 373 | 
            +
            class SourceModuleHnNSF(torch.nn.Module):
         | 
| 374 | 
            +
                """SourceModule for hn-nsf
         | 
| 375 | 
            +
                SourceModule(sampling_rate, harmonic_num=0, sine_amp=0.1,
         | 
| 376 | 
            +
                             add_noise_std=0.003, voiced_threshod=0)
         | 
| 377 | 
            +
                sampling_rate: sampling_rate in Hz
         | 
| 378 | 
            +
                harmonic_num: number of harmonic above F0 (default: 0)
         | 
| 379 | 
            +
                sine_amp: amplitude of sine source signal (default: 0.1)
         | 
| 380 | 
            +
                add_noise_std: std of additive Gaussian noise (default: 0.003)
         | 
| 381 | 
            +
                    note that amplitude of noise in unvoiced is decided
         | 
| 382 | 
            +
                    by sine_amp
         | 
| 383 | 
            +
                voiced_threshold: threhold to set U/V given F0 (default: 0)
         | 
| 384 | 
            +
                Sine_source, noise_source = SourceModuleHnNSF(F0_sampled)
         | 
| 385 | 
            +
                F0_sampled (batchsize, length, 1)
         | 
| 386 | 
            +
                Sine_source (batchsize, length, 1)
         | 
| 387 | 
            +
                noise_source (batchsize, length 1)
         | 
| 388 | 
            +
                uv (batchsize, length, 1)
         | 
| 389 | 
            +
                """
         | 
| 390 | 
            +
             | 
| 391 | 
            +
                def __init__(
         | 
| 392 | 
            +
                    self,
         | 
| 393 | 
            +
                    sampling_rate,
         | 
| 394 | 
            +
                    harmonic_num=0,
         | 
| 395 | 
            +
                    sine_amp=0.1,
         | 
| 396 | 
            +
                    add_noise_std=0.003,
         | 
| 397 | 
            +
                    voiced_threshod=0,
         | 
| 398 | 
            +
                    is_half=True,
         | 
| 399 | 
            +
                ):
         | 
| 400 | 
            +
                    super(SourceModuleHnNSF, self).__init__()
         | 
| 401 | 
            +
             | 
| 402 | 
            +
                    self.sine_amp = sine_amp
         | 
| 403 | 
            +
                    self.noise_std = add_noise_std
         | 
| 404 | 
            +
                    self.is_half = is_half
         | 
| 405 | 
            +
                    # to produce sine waveforms
         | 
| 406 | 
            +
                    self.l_sin_gen = SineGen(
         | 
| 407 | 
            +
                        sampling_rate, harmonic_num, sine_amp, add_noise_std, voiced_threshod
         | 
| 408 | 
            +
                    )
         | 
| 409 | 
            +
             | 
| 410 | 
            +
                    # to merge source harmonics into a single excitation
         | 
| 411 | 
            +
                    self.l_linear = torch.nn.Linear(harmonic_num + 1, 1)
         | 
| 412 | 
            +
                    self.l_tanh = torch.nn.Tanh()
         | 
| 413 | 
            +
             | 
| 414 | 
            +
                def forward(self, x, upp=None):
         | 
| 415 | 
            +
                    sine_wavs, uv, _ = self.l_sin_gen(x, upp)
         | 
| 416 | 
            +
                    if self.is_half:
         | 
| 417 | 
            +
                        sine_wavs = sine_wavs.half()
         | 
| 418 | 
            +
                    sine_merge = self.l_tanh(self.l_linear(sine_wavs))
         | 
| 419 | 
            +
                    return sine_merge, None, None  # noise, uv
         | 
| 420 | 
            +
             | 
| 421 | 
            +
             | 
| 422 | 
            +
            class GeneratorNSF(torch.nn.Module):
         | 
| 423 | 
            +
                def __init__(
         | 
| 424 | 
            +
                    self,
         | 
| 425 | 
            +
                    initial_channel,
         | 
| 426 | 
            +
                    resblock,
         | 
| 427 | 
            +
                    resblock_kernel_sizes,
         | 
| 428 | 
            +
                    resblock_dilation_sizes,
         | 
| 429 | 
            +
                    upsample_rates,
         | 
| 430 | 
            +
                    upsample_initial_channel,
         | 
| 431 | 
            +
                    upsample_kernel_sizes,
         | 
| 432 | 
            +
                    gin_channels,
         | 
| 433 | 
            +
                    sr,
         | 
| 434 | 
            +
                    is_half=False,
         | 
| 435 | 
            +
                ):
         | 
| 436 | 
            +
                    super(GeneratorNSF, self).__init__()
         | 
| 437 | 
            +
                    self.num_kernels = len(resblock_kernel_sizes)
         | 
| 438 | 
            +
                    self.num_upsamples = len(upsample_rates)
         | 
| 439 | 
            +
             | 
| 440 | 
            +
                    self.f0_upsamp = torch.nn.Upsample(scale_factor=np.prod(upsample_rates))
         | 
| 441 | 
            +
                    self.m_source = SourceModuleHnNSF(
         | 
| 442 | 
            +
                        sampling_rate=sr, harmonic_num=0, is_half=is_half
         | 
| 443 | 
            +
                    )
         | 
| 444 | 
            +
                    self.noise_convs = nn.ModuleList()
         | 
| 445 | 
            +
                    self.conv_pre = Conv1d(
         | 
| 446 | 
            +
                        initial_channel, upsample_initial_channel, 7, 1, padding=3
         | 
| 447 | 
            +
                    )
         | 
| 448 | 
            +
                    resblock = modules.ResBlock1 if resblock == "1" else modules.ResBlock2
         | 
| 449 | 
            +
             | 
| 450 | 
            +
                    self.ups = nn.ModuleList()
         | 
| 451 | 
            +
                    for i, (u, k) in enumerate(zip(upsample_rates, upsample_kernel_sizes)):
         | 
| 452 | 
            +
                        c_cur = upsample_initial_channel // (2 ** (i + 1))
         | 
| 453 | 
            +
                        self.ups.append(
         | 
| 454 | 
            +
                            weight_norm(
         | 
| 455 | 
            +
                                ConvTranspose1d(
         | 
| 456 | 
            +
                                    upsample_initial_channel // (2**i),
         | 
| 457 | 
            +
                                    upsample_initial_channel // (2 ** (i + 1)),
         | 
| 458 | 
            +
                                    k,
         | 
| 459 | 
            +
                                    u,
         | 
| 460 | 
            +
                                    padding=(k - u) // 2,
         | 
| 461 | 
            +
                                )
         | 
| 462 | 
            +
                            )
         | 
| 463 | 
            +
                        )
         | 
| 464 | 
            +
                        if i + 1 < len(upsample_rates):
         | 
| 465 | 
            +
                            stride_f0 = np.prod(upsample_rates[i + 1 :])
         | 
| 466 | 
            +
                            self.noise_convs.append(
         | 
| 467 | 
            +
                                Conv1d(
         | 
| 468 | 
            +
                                    1,
         | 
| 469 | 
            +
                                    c_cur,
         | 
| 470 | 
            +
                                    kernel_size=stride_f0 * 2,
         | 
| 471 | 
            +
                                    stride=stride_f0,
         | 
| 472 | 
            +
                                    padding=stride_f0 // 2,
         | 
| 473 | 
            +
                                )
         | 
| 474 | 
            +
                            )
         | 
| 475 | 
            +
                        else:
         | 
| 476 | 
            +
                            self.noise_convs.append(Conv1d(1, c_cur, kernel_size=1))
         | 
| 477 | 
            +
             | 
| 478 | 
            +
                    self.resblocks = nn.ModuleList()
         | 
| 479 | 
            +
                    for i in range(len(self.ups)):
         | 
| 480 | 
            +
                        ch = upsample_initial_channel // (2 ** (i + 1))
         | 
| 481 | 
            +
                        for j, (k, d) in enumerate(
         | 
| 482 | 
            +
                            zip(resblock_kernel_sizes, resblock_dilation_sizes)
         | 
| 483 | 
            +
                        ):
         | 
| 484 | 
            +
                            self.resblocks.append(resblock(ch, k, d))
         | 
| 485 | 
            +
             | 
| 486 | 
            +
                    self.conv_post = Conv1d(ch, 1, 7, 1, padding=3, bias=False)
         | 
| 487 | 
            +
                    self.ups.apply(init_weights)
         | 
| 488 | 
            +
             | 
| 489 | 
            +
                    if gin_channels != 0:
         | 
| 490 | 
            +
                        self.cond = nn.Conv1d(gin_channels, upsample_initial_channel, 1)
         | 
| 491 | 
            +
             | 
| 492 | 
            +
                    self.upp = np.prod(upsample_rates)
         | 
| 493 | 
            +
             | 
| 494 | 
            +
                def forward(self, x, f0, g=None):
         | 
| 495 | 
            +
                    har_source, noi_source, uv = self.m_source(f0, self.upp)
         | 
| 496 | 
            +
                    har_source = har_source.transpose(1, 2)
         | 
| 497 | 
            +
                    x = self.conv_pre(x)
         | 
| 498 | 
            +
                    if g is not None:
         | 
| 499 | 
            +
                        x = x + self.cond(g)
         | 
| 500 | 
            +
             | 
| 501 | 
            +
                    for i in range(self.num_upsamples):
         | 
| 502 | 
            +
                        x = F.leaky_relu(x, modules.LRELU_SLOPE)
         | 
| 503 | 
            +
                        x = self.ups[i](x)
         | 
| 504 | 
            +
                        x_source = self.noise_convs[i](har_source)
         | 
| 505 | 
            +
                        x = x + x_source
         | 
| 506 | 
            +
                        xs = None
         | 
| 507 | 
            +
                        for j in range(self.num_kernels):
         | 
| 508 | 
            +
                            if xs is None:
         | 
| 509 | 
            +
                                xs = self.resblocks[i * self.num_kernels + j](x)
         | 
| 510 | 
            +
                            else:
         | 
| 511 | 
            +
                                xs += self.resblocks[i * self.num_kernels + j](x)
         | 
| 512 | 
            +
                        x = xs / self.num_kernels
         | 
| 513 | 
            +
                    x = F.leaky_relu(x)
         | 
| 514 | 
            +
                    x = self.conv_post(x)
         | 
| 515 | 
            +
                    x = torch.tanh(x)
         | 
| 516 | 
            +
                    return x
         | 
| 517 | 
            +
             | 
| 518 | 
            +
                def remove_weight_norm(self):
         | 
| 519 | 
            +
                    for l in self.ups:
         | 
| 520 | 
            +
                        remove_weight_norm(l)
         | 
| 521 | 
            +
                    for l in self.resblocks:
         | 
| 522 | 
            +
                        l.remove_weight_norm()
         | 
| 523 | 
            +
             | 
| 524 | 
            +
             | 
| 525 | 
            +
            sr2sr = {
         | 
| 526 | 
            +
                "32k": 32000,
         | 
| 527 | 
            +
                "40k": 40000,
         | 
| 528 | 
            +
                "48k": 48000,
         | 
| 529 | 
            +
            }
         | 
| 530 | 
            +
             | 
| 531 | 
            +
             | 
| 532 | 
            +
            class SynthesizerTrnMsNSFsidM(nn.Module):
         | 
| 533 | 
            +
                def __init__(
         | 
| 534 | 
            +
                    self,
         | 
| 535 | 
            +
                    spec_channels,
         | 
| 536 | 
            +
                    segment_size,
         | 
| 537 | 
            +
                    inter_channels,
         | 
| 538 | 
            +
                    hidden_channels,
         | 
| 539 | 
            +
                    filter_channels,
         | 
| 540 | 
            +
                    n_heads,
         | 
| 541 | 
            +
                    n_layers,
         | 
| 542 | 
            +
                    kernel_size,
         | 
| 543 | 
            +
                    p_dropout,
         | 
| 544 | 
            +
                    resblock,
         | 
| 545 | 
            +
                    resblock_kernel_sizes,
         | 
| 546 | 
            +
                    resblock_dilation_sizes,
         | 
| 547 | 
            +
                    upsample_rates,
         | 
| 548 | 
            +
                    upsample_initial_channel,
         | 
| 549 | 
            +
                    upsample_kernel_sizes,
         | 
| 550 | 
            +
                    spk_embed_dim,
         | 
| 551 | 
            +
                    gin_channels,
         | 
| 552 | 
            +
                    sr,
         | 
| 553 | 
            +
                    version,
         | 
| 554 | 
            +
                    **kwargs
         | 
| 555 | 
            +
                ):
         | 
| 556 | 
            +
                    super().__init__()
         | 
| 557 | 
            +
                    if type(sr) == type("strr"):
         | 
| 558 | 
            +
                        sr = sr2sr[sr]
         | 
| 559 | 
            +
                    self.spec_channels = spec_channels
         | 
| 560 | 
            +
                    self.inter_channels = inter_channels
         | 
| 561 | 
            +
                    self.hidden_channels = hidden_channels
         | 
| 562 | 
            +
                    self.filter_channels = filter_channels
         | 
| 563 | 
            +
                    self.n_heads = n_heads
         | 
| 564 | 
            +
                    self.n_layers = n_layers
         | 
| 565 | 
            +
                    self.kernel_size = kernel_size
         | 
| 566 | 
            +
                    self.p_dropout = p_dropout
         | 
| 567 | 
            +
                    self.resblock = resblock
         | 
| 568 | 
            +
                    self.resblock_kernel_sizes = resblock_kernel_sizes
         | 
| 569 | 
            +
                    self.resblock_dilation_sizes = resblock_dilation_sizes
         | 
| 570 | 
            +
                    self.upsample_rates = upsample_rates
         | 
| 571 | 
            +
                    self.upsample_initial_channel = upsample_initial_channel
         | 
| 572 | 
            +
                    self.upsample_kernel_sizes = upsample_kernel_sizes
         | 
| 573 | 
            +
                    self.segment_size = segment_size
         | 
| 574 | 
            +
                    self.gin_channels = gin_channels
         | 
| 575 | 
            +
                    # self.hop_length = hop_length#
         | 
| 576 | 
            +
                    self.spk_embed_dim = spk_embed_dim
         | 
| 577 | 
            +
                    if version == "v1":
         | 
| 578 | 
            +
                        self.enc_p = TextEncoder256(
         | 
| 579 | 
            +
                            inter_channels,
         | 
| 580 | 
            +
                            hidden_channels,
         | 
| 581 | 
            +
                            filter_channels,
         | 
| 582 | 
            +
                            n_heads,
         | 
| 583 | 
            +
                            n_layers,
         | 
| 584 | 
            +
                            kernel_size,
         | 
| 585 | 
            +
                            p_dropout,
         | 
| 586 | 
            +
                        )
         | 
| 587 | 
            +
                    else:
         | 
| 588 | 
            +
                        self.enc_p = TextEncoder768(
         | 
| 589 | 
            +
                            inter_channels,
         | 
| 590 | 
            +
                            hidden_channels,
         | 
| 591 | 
            +
                            filter_channels,
         | 
| 592 | 
            +
                            n_heads,
         | 
| 593 | 
            +
                            n_layers,
         | 
| 594 | 
            +
                            kernel_size,
         | 
| 595 | 
            +
                            p_dropout,
         | 
| 596 | 
            +
                        )
         | 
| 597 | 
            +
                    self.dec = GeneratorNSF(
         | 
| 598 | 
            +
                        inter_channels,
         | 
| 599 | 
            +
                        resblock,
         | 
| 600 | 
            +
                        resblock_kernel_sizes,
         | 
| 601 | 
            +
                        resblock_dilation_sizes,
         | 
| 602 | 
            +
                        upsample_rates,
         | 
| 603 | 
            +
                        upsample_initial_channel,
         | 
| 604 | 
            +
                        upsample_kernel_sizes,
         | 
| 605 | 
            +
                        gin_channels=gin_channels,
         | 
| 606 | 
            +
                        sr=sr,
         | 
| 607 | 
            +
                        is_half=kwargs["is_half"],
         | 
| 608 | 
            +
                    )
         | 
| 609 | 
            +
                    self.enc_q = PosteriorEncoder(
         | 
| 610 | 
            +
                        spec_channels,
         | 
| 611 | 
            +
                        inter_channels,
         | 
| 612 | 
            +
                        hidden_channels,
         | 
| 613 | 
            +
                        5,
         | 
| 614 | 
            +
                        1,
         | 
| 615 | 
            +
                        16,
         | 
| 616 | 
            +
                        gin_channels=gin_channels,
         | 
| 617 | 
            +
                    )
         | 
| 618 | 
            +
                    self.flow = ResidualCouplingBlock(
         | 
| 619 | 
            +
                        inter_channels, hidden_channels, 5, 1, 3, gin_channels=gin_channels
         | 
| 620 | 
            +
                    )
         | 
| 621 | 
            +
                    self.emb_g = nn.Embedding(self.spk_embed_dim, gin_channels)
         | 
| 622 | 
            +
                    self.speaker_map = None
         | 
| 623 | 
            +
                    print("gin_channels:", gin_channels, "self.spk_embed_dim:", self.spk_embed_dim)
         | 
| 624 | 
            +
             | 
| 625 | 
            +
                def remove_weight_norm(self):
         | 
| 626 | 
            +
                    self.dec.remove_weight_norm()
         | 
| 627 | 
            +
                    self.flow.remove_weight_norm()
         | 
| 628 | 
            +
                    self.enc_q.remove_weight_norm()
         | 
| 629 | 
            +
             | 
| 630 | 
            +
                def construct_spkmixmap(self, n_speaker):
         | 
| 631 | 
            +
                    self.speaker_map = torch.zeros((n_speaker, 1, 1, self.gin_channels))
         | 
| 632 | 
            +
                    for i in range(n_speaker):
         | 
| 633 | 
            +
                        self.speaker_map[i] = self.emb_g(torch.LongTensor([[i]]))
         | 
| 634 | 
            +
                    self.speaker_map = self.speaker_map.unsqueeze(0)
         | 
| 635 | 
            +
             | 
| 636 | 
            +
                def forward(self, phone, phone_lengths, pitch, nsff0, g, rnd, max_len=None):
         | 
| 637 | 
            +
                    if self.speaker_map is not None:  # [N, S]  *  [S, B, 1, H]
         | 
| 638 | 
            +
                        g = g.reshape((g.shape[0], g.shape[1], 1, 1, 1))  # [N, S, B, 1, 1]
         | 
| 639 | 
            +
                        g = g * self.speaker_map  # [N, S, B, 1, H]
         | 
| 640 | 
            +
                        g = torch.sum(g, dim=1)  # [N, 1, B, 1, H]
         | 
| 641 | 
            +
                        g = g.transpose(0, -1).transpose(0, -2).squeeze(0)  # [B, H, N]
         | 
| 642 | 
            +
                    else:
         | 
| 643 | 
            +
                        g = g.unsqueeze(0)
         | 
| 644 | 
            +
                        g = self.emb_g(g).transpose(1, 2)
         | 
| 645 | 
            +
             | 
| 646 | 
            +
                    m_p, logs_p, x_mask = self.enc_p(phone, pitch, phone_lengths)
         | 
| 647 | 
            +
                    z_p = (m_p + torch.exp(logs_p) * rnd) * x_mask
         | 
| 648 | 
            +
                    z = self.flow(z_p, x_mask, g=g, reverse=True)
         | 
| 649 | 
            +
                    o = self.dec((z * x_mask)[:, :, :max_len], nsff0, g=g)
         | 
| 650 | 
            +
                    return o
         | 
| 651 | 
            +
             | 
| 652 | 
            +
             | 
| 653 | 
            +
            class MultiPeriodDiscriminator(torch.nn.Module):
         | 
| 654 | 
            +
                def __init__(self, use_spectral_norm=False):
         | 
| 655 | 
            +
                    super(MultiPeriodDiscriminator, self).__init__()
         | 
| 656 | 
            +
                    periods = [2, 3, 5, 7, 11, 17]
         | 
| 657 | 
            +
                    # periods = [3, 5, 7, 11, 17, 23, 37]
         | 
| 658 | 
            +
             | 
| 659 | 
            +
                    discs = [DiscriminatorS(use_spectral_norm=use_spectral_norm)]
         | 
| 660 | 
            +
                    discs = discs + [
         | 
| 661 | 
            +
                        DiscriminatorP(i, use_spectral_norm=use_spectral_norm) for i in periods
         | 
| 662 | 
            +
                    ]
         | 
| 663 | 
            +
                    self.discriminators = nn.ModuleList(discs)
         | 
| 664 | 
            +
             | 
| 665 | 
            +
                def forward(self, y, y_hat):
         | 
| 666 | 
            +
                    y_d_rs = []  #
         | 
| 667 | 
            +
                    y_d_gs = []
         | 
| 668 | 
            +
                    fmap_rs = []
         | 
| 669 | 
            +
                    fmap_gs = []
         | 
| 670 | 
            +
                    for i, d in enumerate(self.discriminators):
         | 
| 671 | 
            +
                        y_d_r, fmap_r = d(y)
         | 
| 672 | 
            +
                        y_d_g, fmap_g = d(y_hat)
         | 
| 673 | 
            +
                        # for j in range(len(fmap_r)):
         | 
| 674 | 
            +
                        #     print(i,j,y.shape,y_hat.shape,fmap_r[j].shape,fmap_g[j].shape)
         | 
| 675 | 
            +
                        y_d_rs.append(y_d_r)
         | 
| 676 | 
            +
                        y_d_gs.append(y_d_g)
         | 
| 677 | 
            +
                        fmap_rs.append(fmap_r)
         | 
| 678 | 
            +
                        fmap_gs.append(fmap_g)
         | 
| 679 | 
            +
             | 
| 680 | 
            +
                    return y_d_rs, y_d_gs, fmap_rs, fmap_gs
         | 
| 681 | 
            +
             | 
| 682 | 
            +
             | 
| 683 | 
            +
            class MultiPeriodDiscriminatorV2(torch.nn.Module):
         | 
| 684 | 
            +
                def __init__(self, use_spectral_norm=False):
         | 
| 685 | 
            +
                    super(MultiPeriodDiscriminatorV2, self).__init__()
         | 
| 686 | 
            +
                    # periods = [2, 3, 5, 7, 11, 17]
         | 
| 687 | 
            +
                    periods = [2, 3, 5, 7, 11, 17, 23, 37]
         | 
| 688 | 
            +
             | 
| 689 | 
            +
                    discs = [DiscriminatorS(use_spectral_norm=use_spectral_norm)]
         | 
| 690 | 
            +
                    discs = discs + [
         | 
| 691 | 
            +
                        DiscriminatorP(i, use_spectral_norm=use_spectral_norm) for i in periods
         | 
| 692 | 
            +
                    ]
         | 
| 693 | 
            +
                    self.discriminators = nn.ModuleList(discs)
         | 
| 694 | 
            +
             | 
| 695 | 
            +
                def forward(self, y, y_hat):
         | 
| 696 | 
            +
                    y_d_rs = []  #
         | 
| 697 | 
            +
                    y_d_gs = []
         | 
| 698 | 
            +
                    fmap_rs = []
         | 
| 699 | 
            +
                    fmap_gs = []
         | 
| 700 | 
            +
                    for i, d in enumerate(self.discriminators):
         | 
| 701 | 
            +
                        y_d_r, fmap_r = d(y)
         | 
| 702 | 
            +
                        y_d_g, fmap_g = d(y_hat)
         | 
| 703 | 
            +
                        # for j in range(len(fmap_r)):
         | 
| 704 | 
            +
                        #     print(i,j,y.shape,y_hat.shape,fmap_r[j].shape,fmap_g[j].shape)
         | 
| 705 | 
            +
                        y_d_rs.append(y_d_r)
         | 
| 706 | 
            +
                        y_d_gs.append(y_d_g)
         | 
| 707 | 
            +
                        fmap_rs.append(fmap_r)
         | 
| 708 | 
            +
                        fmap_gs.append(fmap_g)
         | 
| 709 | 
            +
             | 
| 710 | 
            +
                    return y_d_rs, y_d_gs, fmap_rs, fmap_gs
         | 
| 711 | 
            +
             | 
| 712 | 
            +
             | 
| 713 | 
            +
            class DiscriminatorS(torch.nn.Module):
         | 
| 714 | 
            +
                def __init__(self, use_spectral_norm=False):
         | 
| 715 | 
            +
                    super(DiscriminatorS, self).__init__()
         | 
| 716 | 
            +
                    norm_f = weight_norm if use_spectral_norm == False else spectral_norm
         | 
| 717 | 
            +
                    self.convs = nn.ModuleList(
         | 
| 718 | 
            +
                        [
         | 
| 719 | 
            +
                            norm_f(Conv1d(1, 16, 15, 1, padding=7)),
         | 
| 720 | 
            +
                            norm_f(Conv1d(16, 64, 41, 4, groups=4, padding=20)),
         | 
| 721 | 
            +
                            norm_f(Conv1d(64, 256, 41, 4, groups=16, padding=20)),
         | 
| 722 | 
            +
                            norm_f(Conv1d(256, 1024, 41, 4, groups=64, padding=20)),
         | 
| 723 | 
            +
                            norm_f(Conv1d(1024, 1024, 41, 4, groups=256, padding=20)),
         | 
| 724 | 
            +
                            norm_f(Conv1d(1024, 1024, 5, 1, padding=2)),
         | 
| 725 | 
            +
                        ]
         | 
| 726 | 
            +
                    )
         | 
| 727 | 
            +
                    self.conv_post = norm_f(Conv1d(1024, 1, 3, 1, padding=1))
         | 
| 728 | 
            +
             | 
| 729 | 
            +
                def forward(self, x):
         | 
| 730 | 
            +
                    fmap = []
         | 
| 731 | 
            +
             | 
| 732 | 
            +
                    for l in self.convs:
         | 
| 733 | 
            +
                        x = l(x)
         | 
| 734 | 
            +
                        x = F.leaky_relu(x, modules.LRELU_SLOPE)
         | 
| 735 | 
            +
                        fmap.append(x)
         | 
| 736 | 
            +
                    x = self.conv_post(x)
         | 
| 737 | 
            +
                    fmap.append(x)
         | 
| 738 | 
            +
                    x = torch.flatten(x, 1, -1)
         | 
| 739 | 
            +
             | 
| 740 | 
            +
                    return x, fmap
         | 
| 741 | 
            +
             | 
| 742 | 
            +
             | 
| 743 | 
            +
            class DiscriminatorP(torch.nn.Module):
         | 
| 744 | 
            +
                def __init__(self, period, kernel_size=5, stride=3, use_spectral_norm=False):
         | 
| 745 | 
            +
                    super(DiscriminatorP, self).__init__()
         | 
| 746 | 
            +
                    self.period = period
         | 
| 747 | 
            +
                    self.use_spectral_norm = use_spectral_norm
         | 
| 748 | 
            +
                    norm_f = weight_norm if use_spectral_norm == False else spectral_norm
         | 
| 749 | 
            +
                    self.convs = nn.ModuleList(
         | 
| 750 | 
            +
                        [
         | 
| 751 | 
            +
                            norm_f(
         | 
| 752 | 
            +
                                Conv2d(
         | 
| 753 | 
            +
                                    1,
         | 
| 754 | 
            +
                                    32,
         | 
| 755 | 
            +
                                    (kernel_size, 1),
         | 
| 756 | 
            +
                                    (stride, 1),
         | 
| 757 | 
            +
                                    padding=(get_padding(kernel_size, 1), 0),
         | 
| 758 | 
            +
                                )
         | 
| 759 | 
            +
                            ),
         | 
| 760 | 
            +
                            norm_f(
         | 
| 761 | 
            +
                                Conv2d(
         | 
| 762 | 
            +
                                    32,
         | 
| 763 | 
            +
                                    128,
         | 
| 764 | 
            +
                                    (kernel_size, 1),
         | 
| 765 | 
            +
                                    (stride, 1),
         | 
| 766 | 
            +
                                    padding=(get_padding(kernel_size, 1), 0),
         | 
| 767 | 
            +
                                )
         | 
| 768 | 
            +
                            ),
         | 
| 769 | 
            +
                            norm_f(
         | 
| 770 | 
            +
                                Conv2d(
         | 
| 771 | 
            +
                                    128,
         | 
| 772 | 
            +
                                    512,
         | 
| 773 | 
            +
                                    (kernel_size, 1),
         | 
| 774 | 
            +
                                    (stride, 1),
         | 
| 775 | 
            +
                                    padding=(get_padding(kernel_size, 1), 0),
         | 
| 776 | 
            +
                                )
         | 
| 777 | 
            +
                            ),
         | 
| 778 | 
            +
                            norm_f(
         | 
| 779 | 
            +
                                Conv2d(
         | 
| 780 | 
            +
                                    512,
         | 
| 781 | 
            +
                                    1024,
         | 
| 782 | 
            +
                                    (kernel_size, 1),
         | 
| 783 | 
            +
                                    (stride, 1),
         | 
| 784 | 
            +
                                    padding=(get_padding(kernel_size, 1), 0),
         | 
| 785 | 
            +
                                )
         | 
| 786 | 
            +
                            ),
         | 
| 787 | 
            +
                            norm_f(
         | 
| 788 | 
            +
                                Conv2d(
         | 
| 789 | 
            +
                                    1024,
         | 
| 790 | 
            +
                                    1024,
         | 
| 791 | 
            +
                                    (kernel_size, 1),
         | 
| 792 | 
            +
                                    1,
         | 
| 793 | 
            +
                                    padding=(get_padding(kernel_size, 1), 0),
         | 
| 794 | 
            +
                                )
         | 
| 795 | 
            +
                            ),
         | 
| 796 | 
            +
                        ]
         | 
| 797 | 
            +
                    )
         | 
| 798 | 
            +
                    self.conv_post = norm_f(Conv2d(1024, 1, (3, 1), 1, padding=(1, 0)))
         | 
| 799 | 
            +
             | 
| 800 | 
            +
                def forward(self, x):
         | 
| 801 | 
            +
                    fmap = []
         | 
| 802 | 
            +
             | 
| 803 | 
            +
                    # 1d to 2d
         | 
| 804 | 
            +
                    b, c, t = x.shape
         | 
| 805 | 
            +
                    if t % self.period != 0:  # pad first
         | 
| 806 | 
            +
                        n_pad = self.period - (t % self.period)
         | 
| 807 | 
            +
                        x = F.pad(x, (0, n_pad), "reflect")
         | 
| 808 | 
            +
                        t = t + n_pad
         | 
| 809 | 
            +
                    x = x.view(b, c, t // self.period, self.period)
         | 
| 810 | 
            +
             | 
| 811 | 
            +
                    for l in self.convs:
         | 
| 812 | 
            +
                        x = l(x)
         | 
| 813 | 
            +
                        x = F.leaky_relu(x, modules.LRELU_SLOPE)
         | 
| 814 | 
            +
                        fmap.append(x)
         | 
| 815 | 
            +
                    x = self.conv_post(x)
         | 
| 816 | 
            +
                    fmap.append(x)
         | 
| 817 | 
            +
                    x = torch.flatten(x, 1, -1)
         | 
| 818 | 
            +
             | 
| 819 | 
            +
                    return x, fmap
         | 
    	
        lib/infer_pack/modules.py
    ADDED
    
    | @@ -0,0 +1,522 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            import copy
         | 
| 2 | 
            +
            import math
         | 
| 3 | 
            +
            import numpy as np
         | 
| 4 | 
            +
            import scipy
         | 
| 5 | 
            +
            import torch
         | 
| 6 | 
            +
            from torch import nn
         | 
| 7 | 
            +
            from torch.nn import functional as F
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            from torch.nn import Conv1d, ConvTranspose1d, AvgPool1d, Conv2d
         | 
| 10 | 
            +
            from torch.nn.utils import weight_norm, remove_weight_norm
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            from lib.infer_pack import commons
         | 
| 13 | 
            +
            from lib.infer_pack.commons import init_weights, get_padding
         | 
| 14 | 
            +
            from lib.infer_pack.transforms import piecewise_rational_quadratic_transform
         | 
| 15 | 
            +
             | 
| 16 | 
            +
             | 
| 17 | 
            +
            LRELU_SLOPE = 0.1
         | 
| 18 | 
            +
             | 
| 19 | 
            +
             | 
| 20 | 
            +
            class LayerNorm(nn.Module):
         | 
| 21 | 
            +
                def __init__(self, channels, eps=1e-5):
         | 
| 22 | 
            +
                    super().__init__()
         | 
| 23 | 
            +
                    self.channels = channels
         | 
| 24 | 
            +
                    self.eps = eps
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                    self.gamma = nn.Parameter(torch.ones(channels))
         | 
| 27 | 
            +
                    self.beta = nn.Parameter(torch.zeros(channels))
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                def forward(self, x):
         | 
| 30 | 
            +
                    x = x.transpose(1, -1)
         | 
| 31 | 
            +
                    x = F.layer_norm(x, (self.channels,), self.gamma, self.beta, self.eps)
         | 
| 32 | 
            +
                    return x.transpose(1, -1)
         | 
| 33 | 
            +
             | 
| 34 | 
            +
             | 
| 35 | 
            +
            class ConvReluNorm(nn.Module):
         | 
| 36 | 
            +
                def __init__(
         | 
| 37 | 
            +
                    self,
         | 
| 38 | 
            +
                    in_channels,
         | 
| 39 | 
            +
                    hidden_channels,
         | 
| 40 | 
            +
                    out_channels,
         | 
| 41 | 
            +
                    kernel_size,
         | 
| 42 | 
            +
                    n_layers,
         | 
| 43 | 
            +
                    p_dropout,
         | 
| 44 | 
            +
                ):
         | 
| 45 | 
            +
                    super().__init__()
         | 
| 46 | 
            +
                    self.in_channels = in_channels
         | 
| 47 | 
            +
                    self.hidden_channels = hidden_channels
         | 
| 48 | 
            +
                    self.out_channels = out_channels
         | 
| 49 | 
            +
                    self.kernel_size = kernel_size
         | 
| 50 | 
            +
                    self.n_layers = n_layers
         | 
| 51 | 
            +
                    self.p_dropout = p_dropout
         | 
| 52 | 
            +
                    assert n_layers > 1, "Number of layers should be larger than 0."
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                    self.conv_layers = nn.ModuleList()
         | 
| 55 | 
            +
                    self.norm_layers = nn.ModuleList()
         | 
| 56 | 
            +
                    self.conv_layers.append(
         | 
| 57 | 
            +
                        nn.Conv1d(
         | 
| 58 | 
            +
                            in_channels, hidden_channels, kernel_size, padding=kernel_size // 2
         | 
| 59 | 
            +
                        )
         | 
| 60 | 
            +
                    )
         | 
| 61 | 
            +
                    self.norm_layers.append(LayerNorm(hidden_channels))
         | 
| 62 | 
            +
                    self.relu_drop = nn.Sequential(nn.ReLU(), nn.Dropout(p_dropout))
         | 
| 63 | 
            +
                    for _ in range(n_layers - 1):
         | 
| 64 | 
            +
                        self.conv_layers.append(
         | 
| 65 | 
            +
                            nn.Conv1d(
         | 
| 66 | 
            +
                                hidden_channels,
         | 
| 67 | 
            +
                                hidden_channels,
         | 
| 68 | 
            +
                                kernel_size,
         | 
| 69 | 
            +
                                padding=kernel_size // 2,
         | 
| 70 | 
            +
                            )
         | 
| 71 | 
            +
                        )
         | 
| 72 | 
            +
                        self.norm_layers.append(LayerNorm(hidden_channels))
         | 
| 73 | 
            +
                    self.proj = nn.Conv1d(hidden_channels, out_channels, 1)
         | 
| 74 | 
            +
                    self.proj.weight.data.zero_()
         | 
| 75 | 
            +
                    self.proj.bias.data.zero_()
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                def forward(self, x, x_mask):
         | 
| 78 | 
            +
                    x_org = x
         | 
| 79 | 
            +
                    for i in range(self.n_layers):
         | 
| 80 | 
            +
                        x = self.conv_layers[i](x * x_mask)
         | 
| 81 | 
            +
                        x = self.norm_layers[i](x)
         | 
| 82 | 
            +
                        x = self.relu_drop(x)
         | 
| 83 | 
            +
                    x = x_org + self.proj(x)
         | 
| 84 | 
            +
                    return x * x_mask
         | 
| 85 | 
            +
             | 
| 86 | 
            +
             | 
| 87 | 
            +
            class DDSConv(nn.Module):
         | 
| 88 | 
            +
                """
         | 
| 89 | 
            +
                Dialted and Depth-Separable Convolution
         | 
| 90 | 
            +
                """
         | 
| 91 | 
            +
             | 
| 92 | 
            +
                def __init__(self, channels, kernel_size, n_layers, p_dropout=0.0):
         | 
| 93 | 
            +
                    super().__init__()
         | 
| 94 | 
            +
                    self.channels = channels
         | 
| 95 | 
            +
                    self.kernel_size = kernel_size
         | 
| 96 | 
            +
                    self.n_layers = n_layers
         | 
| 97 | 
            +
                    self.p_dropout = p_dropout
         | 
| 98 | 
            +
             | 
| 99 | 
            +
                    self.drop = nn.Dropout(p_dropout)
         | 
| 100 | 
            +
                    self.convs_sep = nn.ModuleList()
         | 
| 101 | 
            +
                    self.convs_1x1 = nn.ModuleList()
         | 
| 102 | 
            +
                    self.norms_1 = nn.ModuleList()
         | 
| 103 | 
            +
                    self.norms_2 = nn.ModuleList()
         | 
| 104 | 
            +
                    for i in range(n_layers):
         | 
| 105 | 
            +
                        dilation = kernel_size**i
         | 
| 106 | 
            +
                        padding = (kernel_size * dilation - dilation) // 2
         | 
| 107 | 
            +
                        self.convs_sep.append(
         | 
| 108 | 
            +
                            nn.Conv1d(
         | 
| 109 | 
            +
                                channels,
         | 
| 110 | 
            +
                                channels,
         | 
| 111 | 
            +
                                kernel_size,
         | 
| 112 | 
            +
                                groups=channels,
         | 
| 113 | 
            +
                                dilation=dilation,
         | 
| 114 | 
            +
                                padding=padding,
         | 
| 115 | 
            +
                            )
         | 
| 116 | 
            +
                        )
         | 
| 117 | 
            +
                        self.convs_1x1.append(nn.Conv1d(channels, channels, 1))
         | 
| 118 | 
            +
                        self.norms_1.append(LayerNorm(channels))
         | 
| 119 | 
            +
                        self.norms_2.append(LayerNorm(channels))
         | 
| 120 | 
            +
             | 
| 121 | 
            +
                def forward(self, x, x_mask, g=None):
         | 
| 122 | 
            +
                    if g is not None:
         | 
| 123 | 
            +
                        x = x + g
         | 
| 124 | 
            +
                    for i in range(self.n_layers):
         | 
| 125 | 
            +
                        y = self.convs_sep[i](x * x_mask)
         | 
| 126 | 
            +
                        y = self.norms_1[i](y)
         | 
| 127 | 
            +
                        y = F.gelu(y)
         | 
| 128 | 
            +
                        y = self.convs_1x1[i](y)
         | 
| 129 | 
            +
                        y = self.norms_2[i](y)
         | 
| 130 | 
            +
                        y = F.gelu(y)
         | 
| 131 | 
            +
                        y = self.drop(y)
         | 
| 132 | 
            +
                        x = x + y
         | 
| 133 | 
            +
                    return x * x_mask
         | 
| 134 | 
            +
             | 
| 135 | 
            +
             | 
| 136 | 
            +
            class WN(torch.nn.Module):
         | 
| 137 | 
            +
                def __init__(
         | 
| 138 | 
            +
                    self,
         | 
| 139 | 
            +
                    hidden_channels,
         | 
| 140 | 
            +
                    kernel_size,
         | 
| 141 | 
            +
                    dilation_rate,
         | 
| 142 | 
            +
                    n_layers,
         | 
| 143 | 
            +
                    gin_channels=0,
         | 
| 144 | 
            +
                    p_dropout=0,
         | 
| 145 | 
            +
                ):
         | 
| 146 | 
            +
                    super(WN, self).__init__()
         | 
| 147 | 
            +
                    assert kernel_size % 2 == 1
         | 
| 148 | 
            +
                    self.hidden_channels = hidden_channels
         | 
| 149 | 
            +
                    self.kernel_size = (kernel_size,)
         | 
| 150 | 
            +
                    self.dilation_rate = dilation_rate
         | 
| 151 | 
            +
                    self.n_layers = n_layers
         | 
| 152 | 
            +
                    self.gin_channels = gin_channels
         | 
| 153 | 
            +
                    self.p_dropout = p_dropout
         | 
| 154 | 
            +
             | 
| 155 | 
            +
                    self.in_layers = torch.nn.ModuleList()
         | 
| 156 | 
            +
                    self.res_skip_layers = torch.nn.ModuleList()
         | 
| 157 | 
            +
                    self.drop = nn.Dropout(p_dropout)
         | 
| 158 | 
            +
             | 
| 159 | 
            +
                    if gin_channels != 0:
         | 
| 160 | 
            +
                        cond_layer = torch.nn.Conv1d(
         | 
| 161 | 
            +
                            gin_channels, 2 * hidden_channels * n_layers, 1
         | 
| 162 | 
            +
                        )
         | 
| 163 | 
            +
                        self.cond_layer = torch.nn.utils.weight_norm(cond_layer, name="weight")
         | 
| 164 | 
            +
             | 
| 165 | 
            +
                    for i in range(n_layers):
         | 
| 166 | 
            +
                        dilation = dilation_rate**i
         | 
| 167 | 
            +
                        padding = int((kernel_size * dilation - dilation) / 2)
         | 
| 168 | 
            +
                        in_layer = torch.nn.Conv1d(
         | 
| 169 | 
            +
                            hidden_channels,
         | 
| 170 | 
            +
                            2 * hidden_channels,
         | 
| 171 | 
            +
                            kernel_size,
         | 
| 172 | 
            +
                            dilation=dilation,
         | 
| 173 | 
            +
                            padding=padding,
         | 
| 174 | 
            +
                        )
         | 
| 175 | 
            +
                        in_layer = torch.nn.utils.weight_norm(in_layer, name="weight")
         | 
| 176 | 
            +
                        self.in_layers.append(in_layer)
         | 
| 177 | 
            +
             | 
| 178 | 
            +
                        # last one is not necessary
         | 
| 179 | 
            +
                        if i < n_layers - 1:
         | 
| 180 | 
            +
                            res_skip_channels = 2 * hidden_channels
         | 
| 181 | 
            +
                        else:
         | 
| 182 | 
            +
                            res_skip_channels = hidden_channels
         | 
| 183 | 
            +
             | 
| 184 | 
            +
                        res_skip_layer = torch.nn.Conv1d(hidden_channels, res_skip_channels, 1)
         | 
| 185 | 
            +
                        res_skip_layer = torch.nn.utils.weight_norm(res_skip_layer, name="weight")
         | 
| 186 | 
            +
                        self.res_skip_layers.append(res_skip_layer)
         | 
| 187 | 
            +
             | 
| 188 | 
            +
                def forward(self, x, x_mask, g=None, **kwargs):
         | 
| 189 | 
            +
                    output = torch.zeros_like(x)
         | 
| 190 | 
            +
                    n_channels_tensor = torch.IntTensor([self.hidden_channels])
         | 
| 191 | 
            +
             | 
| 192 | 
            +
                    if g is not None:
         | 
| 193 | 
            +
                        g = self.cond_layer(g)
         | 
| 194 | 
            +
             | 
| 195 | 
            +
                    for i in range(self.n_layers):
         | 
| 196 | 
            +
                        x_in = self.in_layers[i](x)
         | 
| 197 | 
            +
                        if g is not None:
         | 
| 198 | 
            +
                            cond_offset = i * 2 * self.hidden_channels
         | 
| 199 | 
            +
                            g_l = g[:, cond_offset : cond_offset + 2 * self.hidden_channels, :]
         | 
| 200 | 
            +
                        else:
         | 
| 201 | 
            +
                            g_l = torch.zeros_like(x_in)
         | 
| 202 | 
            +
             | 
| 203 | 
            +
                        acts = commons.fused_add_tanh_sigmoid_multiply(x_in, g_l, n_channels_tensor)
         | 
| 204 | 
            +
                        acts = self.drop(acts)
         | 
| 205 | 
            +
             | 
| 206 | 
            +
                        res_skip_acts = self.res_skip_layers[i](acts)
         | 
| 207 | 
            +
                        if i < self.n_layers - 1:
         | 
| 208 | 
            +
                            res_acts = res_skip_acts[:, : self.hidden_channels, :]
         | 
| 209 | 
            +
                            x = (x + res_acts) * x_mask
         | 
| 210 | 
            +
                            output = output + res_skip_acts[:, self.hidden_channels :, :]
         | 
| 211 | 
            +
                        else:
         | 
| 212 | 
            +
                            output = output + res_skip_acts
         | 
| 213 | 
            +
                    return output * x_mask
         | 
| 214 | 
            +
             | 
| 215 | 
            +
                def remove_weight_norm(self):
         | 
| 216 | 
            +
                    if self.gin_channels != 0:
         | 
| 217 | 
            +
                        torch.nn.utils.remove_weight_norm(self.cond_layer)
         | 
| 218 | 
            +
                    for l in self.in_layers:
         | 
| 219 | 
            +
                        torch.nn.utils.remove_weight_norm(l)
         | 
| 220 | 
            +
                    for l in self.res_skip_layers:
         | 
| 221 | 
            +
                        torch.nn.utils.remove_weight_norm(l)
         | 
| 222 | 
            +
             | 
| 223 | 
            +
             | 
| 224 | 
            +
            class ResBlock1(torch.nn.Module):
         | 
| 225 | 
            +
                def __init__(self, channels, kernel_size=3, dilation=(1, 3, 5)):
         | 
| 226 | 
            +
                    super(ResBlock1, self).__init__()
         | 
| 227 | 
            +
                    self.convs1 = nn.ModuleList(
         | 
| 228 | 
            +
                        [
         | 
| 229 | 
            +
                            weight_norm(
         | 
| 230 | 
            +
                                Conv1d(
         | 
| 231 | 
            +
                                    channels,
         | 
| 232 | 
            +
                                    channels,
         | 
| 233 | 
            +
                                    kernel_size,
         | 
| 234 | 
            +
                                    1,
         | 
| 235 | 
            +
                                    dilation=dilation[0],
         | 
| 236 | 
            +
                                    padding=get_padding(kernel_size, dilation[0]),
         | 
| 237 | 
            +
                                )
         | 
| 238 | 
            +
                            ),
         | 
| 239 | 
            +
                            weight_norm(
         | 
| 240 | 
            +
                                Conv1d(
         | 
| 241 | 
            +
                                    channels,
         | 
| 242 | 
            +
                                    channels,
         | 
| 243 | 
            +
                                    kernel_size,
         | 
| 244 | 
            +
                                    1,
         | 
| 245 | 
            +
                                    dilation=dilation[1],
         | 
| 246 | 
            +
                                    padding=get_padding(kernel_size, dilation[1]),
         | 
| 247 | 
            +
                                )
         | 
| 248 | 
            +
                            ),
         | 
| 249 | 
            +
                            weight_norm(
         | 
| 250 | 
            +
                                Conv1d(
         | 
| 251 | 
            +
                                    channels,
         | 
| 252 | 
            +
                                    channels,
         | 
| 253 | 
            +
                                    kernel_size,
         | 
| 254 | 
            +
                                    1,
         | 
| 255 | 
            +
                                    dilation=dilation[2],
         | 
| 256 | 
            +
                                    padding=get_padding(kernel_size, dilation[2]),
         | 
| 257 | 
            +
                                )
         | 
| 258 | 
            +
                            ),
         | 
| 259 | 
            +
                        ]
         | 
| 260 | 
            +
                    )
         | 
| 261 | 
            +
                    self.convs1.apply(init_weights)
         | 
| 262 | 
            +
             | 
| 263 | 
            +
                    self.convs2 = nn.ModuleList(
         | 
| 264 | 
            +
                        [
         | 
| 265 | 
            +
                            weight_norm(
         | 
| 266 | 
            +
                                Conv1d(
         | 
| 267 | 
            +
                                    channels,
         | 
| 268 | 
            +
                                    channels,
         | 
| 269 | 
            +
                                    kernel_size,
         | 
| 270 | 
            +
                                    1,
         | 
| 271 | 
            +
                                    dilation=1,
         | 
| 272 | 
            +
                                    padding=get_padding(kernel_size, 1),
         | 
| 273 | 
            +
                                )
         | 
| 274 | 
            +
                            ),
         | 
| 275 | 
            +
                            weight_norm(
         | 
| 276 | 
            +
                                Conv1d(
         | 
| 277 | 
            +
                                    channels,
         | 
| 278 | 
            +
                                    channels,
         | 
| 279 | 
            +
                                    kernel_size,
         | 
| 280 | 
            +
                                    1,
         | 
| 281 | 
            +
                                    dilation=1,
         | 
| 282 | 
            +
                                    padding=get_padding(kernel_size, 1),
         | 
| 283 | 
            +
                                )
         | 
| 284 | 
            +
                            ),
         | 
| 285 | 
            +
                            weight_norm(
         | 
| 286 | 
            +
                                Conv1d(
         | 
| 287 | 
            +
                                    channels,
         | 
| 288 | 
            +
                                    channels,
         | 
| 289 | 
            +
                                    kernel_size,
         | 
| 290 | 
            +
                                    1,
         | 
| 291 | 
            +
                                    dilation=1,
         | 
| 292 | 
            +
                                    padding=get_padding(kernel_size, 1),
         | 
| 293 | 
            +
                                )
         | 
| 294 | 
            +
                            ),
         | 
| 295 | 
            +
                        ]
         | 
| 296 | 
            +
                    )
         | 
| 297 | 
            +
                    self.convs2.apply(init_weights)
         | 
| 298 | 
            +
             | 
| 299 | 
            +
                def forward(self, x, x_mask=None):
         | 
| 300 | 
            +
                    for c1, c2 in zip(self.convs1, self.convs2):
         | 
| 301 | 
            +
                        xt = F.leaky_relu(x, LRELU_SLOPE)
         | 
| 302 | 
            +
                        if x_mask is not None:
         | 
| 303 | 
            +
                            xt = xt * x_mask
         | 
| 304 | 
            +
                        xt = c1(xt)
         | 
| 305 | 
            +
                        xt = F.leaky_relu(xt, LRELU_SLOPE)
         | 
| 306 | 
            +
                        if x_mask is not None:
         | 
| 307 | 
            +
                            xt = xt * x_mask
         | 
| 308 | 
            +
                        xt = c2(xt)
         | 
| 309 | 
            +
                        x = xt + x
         | 
| 310 | 
            +
                    if x_mask is not None:
         | 
| 311 | 
            +
                        x = x * x_mask
         | 
| 312 | 
            +
                    return x
         | 
| 313 | 
            +
             | 
| 314 | 
            +
                def remove_weight_norm(self):
         | 
| 315 | 
            +
                    for l in self.convs1:
         | 
| 316 | 
            +
                        remove_weight_norm(l)
         | 
| 317 | 
            +
                    for l in self.convs2:
         | 
| 318 | 
            +
                        remove_weight_norm(l)
         | 
| 319 | 
            +
             | 
| 320 | 
            +
             | 
| 321 | 
            +
            class ResBlock2(torch.nn.Module):
         | 
| 322 | 
            +
                def __init__(self, channels, kernel_size=3, dilation=(1, 3)):
         | 
| 323 | 
            +
                    super(ResBlock2, self).__init__()
         | 
| 324 | 
            +
                    self.convs = nn.ModuleList(
         | 
| 325 | 
            +
                        [
         | 
| 326 | 
            +
                            weight_norm(
         | 
| 327 | 
            +
                                Conv1d(
         | 
| 328 | 
            +
                                    channels,
         | 
| 329 | 
            +
                                    channels,
         | 
| 330 | 
            +
                                    kernel_size,
         | 
| 331 | 
            +
                                    1,
         | 
| 332 | 
            +
                                    dilation=dilation[0],
         | 
| 333 | 
            +
                                    padding=get_padding(kernel_size, dilation[0]),
         | 
| 334 | 
            +
                                )
         | 
| 335 | 
            +
                            ),
         | 
| 336 | 
            +
                            weight_norm(
         | 
| 337 | 
            +
                                Conv1d(
         | 
| 338 | 
            +
                                    channels,
         | 
| 339 | 
            +
                                    channels,
         | 
| 340 | 
            +
                                    kernel_size,
         | 
| 341 | 
            +
                                    1,
         | 
| 342 | 
            +
                                    dilation=dilation[1],
         | 
| 343 | 
            +
                                    padding=get_padding(kernel_size, dilation[1]),
         | 
| 344 | 
            +
                                )
         | 
| 345 | 
            +
                            ),
         | 
| 346 | 
            +
                        ]
         | 
| 347 | 
            +
                    )
         | 
| 348 | 
            +
                    self.convs.apply(init_weights)
         | 
| 349 | 
            +
             | 
| 350 | 
            +
                def forward(self, x, x_mask=None):
         | 
| 351 | 
            +
                    for c in self.convs:
         | 
| 352 | 
            +
                        xt = F.leaky_relu(x, LRELU_SLOPE)
         | 
| 353 | 
            +
                        if x_mask is not None:
         | 
| 354 | 
            +
                            xt = xt * x_mask
         | 
| 355 | 
            +
                        xt = c(xt)
         | 
| 356 | 
            +
                        x = xt + x
         | 
| 357 | 
            +
                    if x_mask is not None:
         | 
| 358 | 
            +
                        x = x * x_mask
         | 
| 359 | 
            +
                    return x
         | 
| 360 | 
            +
             | 
| 361 | 
            +
                def remove_weight_norm(self):
         | 
| 362 | 
            +
                    for l in self.convs:
         | 
| 363 | 
            +
                        remove_weight_norm(l)
         | 
| 364 | 
            +
             | 
| 365 | 
            +
             | 
| 366 | 
            +
            class Log(nn.Module):
         | 
| 367 | 
            +
                def forward(self, x, x_mask, reverse=False, **kwargs):
         | 
| 368 | 
            +
                    if not reverse:
         | 
| 369 | 
            +
                        y = torch.log(torch.clamp_min(x, 1e-5)) * x_mask
         | 
| 370 | 
            +
                        logdet = torch.sum(-y, [1, 2])
         | 
| 371 | 
            +
                        return y, logdet
         | 
| 372 | 
            +
                    else:
         | 
| 373 | 
            +
                        x = torch.exp(x) * x_mask
         | 
| 374 | 
            +
                        return x
         | 
| 375 | 
            +
             | 
| 376 | 
            +
             | 
| 377 | 
            +
            class Flip(nn.Module):
         | 
| 378 | 
            +
                def forward(self, x, *args, reverse=False, **kwargs):
         | 
| 379 | 
            +
                    x = torch.flip(x, [1])
         | 
| 380 | 
            +
                    if not reverse:
         | 
| 381 | 
            +
                        logdet = torch.zeros(x.size(0)).to(dtype=x.dtype, device=x.device)
         | 
| 382 | 
            +
                        return x, logdet
         | 
| 383 | 
            +
                    else:
         | 
| 384 | 
            +
                        return x
         | 
| 385 | 
            +
             | 
| 386 | 
            +
             | 
| 387 | 
            +
            class ElementwiseAffine(nn.Module):
         | 
| 388 | 
            +
                def __init__(self, channels):
         | 
| 389 | 
            +
                    super().__init__()
         | 
| 390 | 
            +
                    self.channels = channels
         | 
| 391 | 
            +
                    self.m = nn.Parameter(torch.zeros(channels, 1))
         | 
| 392 | 
            +
                    self.logs = nn.Parameter(torch.zeros(channels, 1))
         | 
| 393 | 
            +
             | 
| 394 | 
            +
                def forward(self, x, x_mask, reverse=False, **kwargs):
         | 
| 395 | 
            +
                    if not reverse:
         | 
| 396 | 
            +
                        y = self.m + torch.exp(self.logs) * x
         | 
| 397 | 
            +
                        y = y * x_mask
         | 
| 398 | 
            +
                        logdet = torch.sum(self.logs * x_mask, [1, 2])
         | 
| 399 | 
            +
                        return y, logdet
         | 
| 400 | 
            +
                    else:
         | 
| 401 | 
            +
                        x = (x - self.m) * torch.exp(-self.logs) * x_mask
         | 
| 402 | 
            +
                        return x
         | 
| 403 | 
            +
             | 
| 404 | 
            +
             | 
| 405 | 
            +
            class ResidualCouplingLayer(nn.Module):
         | 
| 406 | 
            +
                def __init__(
         | 
| 407 | 
            +
                    self,
         | 
| 408 | 
            +
                    channels,
         | 
| 409 | 
            +
                    hidden_channels,
         | 
| 410 | 
            +
                    kernel_size,
         | 
| 411 | 
            +
                    dilation_rate,
         | 
| 412 | 
            +
                    n_layers,
         | 
| 413 | 
            +
                    p_dropout=0,
         | 
| 414 | 
            +
                    gin_channels=0,
         | 
| 415 | 
            +
                    mean_only=False,
         | 
| 416 | 
            +
                ):
         | 
| 417 | 
            +
                    assert channels % 2 == 0, "channels should be divisible by 2"
         | 
| 418 | 
            +
                    super().__init__()
         | 
| 419 | 
            +
                    self.channels = channels
         | 
| 420 | 
            +
                    self.hidden_channels = hidden_channels
         | 
| 421 | 
            +
                    self.kernel_size = kernel_size
         | 
| 422 | 
            +
                    self.dilation_rate = dilation_rate
         | 
| 423 | 
            +
                    self.n_layers = n_layers
         | 
| 424 | 
            +
                    self.half_channels = channels // 2
         | 
| 425 | 
            +
                    self.mean_only = mean_only
         | 
| 426 | 
            +
             | 
| 427 | 
            +
                    self.pre = nn.Conv1d(self.half_channels, hidden_channels, 1)
         | 
| 428 | 
            +
                    self.enc = WN(
         | 
| 429 | 
            +
                        hidden_channels,
         | 
| 430 | 
            +
                        kernel_size,
         | 
| 431 | 
            +
                        dilation_rate,
         | 
| 432 | 
            +
                        n_layers,
         | 
| 433 | 
            +
                        p_dropout=p_dropout,
         | 
| 434 | 
            +
                        gin_channels=gin_channels,
         | 
| 435 | 
            +
                    )
         | 
| 436 | 
            +
                    self.post = nn.Conv1d(hidden_channels, self.half_channels * (2 - mean_only), 1)
         | 
| 437 | 
            +
                    self.post.weight.data.zero_()
         | 
| 438 | 
            +
                    self.post.bias.data.zero_()
         | 
| 439 | 
            +
             | 
| 440 | 
            +
                def forward(self, x, x_mask, g=None, reverse=False):
         | 
| 441 | 
            +
                    x0, x1 = torch.split(x, [self.half_channels] * 2, 1)
         | 
| 442 | 
            +
                    h = self.pre(x0) * x_mask
         | 
| 443 | 
            +
                    h = self.enc(h, x_mask, g=g)
         | 
| 444 | 
            +
                    stats = self.post(h) * x_mask
         | 
| 445 | 
            +
                    if not self.mean_only:
         | 
| 446 | 
            +
                        m, logs = torch.split(stats, [self.half_channels] * 2, 1)
         | 
| 447 | 
            +
                    else:
         | 
| 448 | 
            +
                        m = stats
         | 
| 449 | 
            +
                        logs = torch.zeros_like(m)
         | 
| 450 | 
            +
             | 
| 451 | 
            +
                    if not reverse:
         | 
| 452 | 
            +
                        x1 = m + x1 * torch.exp(logs) * x_mask
         | 
| 453 | 
            +
                        x = torch.cat([x0, x1], 1)
         | 
| 454 | 
            +
                        logdet = torch.sum(logs, [1, 2])
         | 
| 455 | 
            +
                        return x, logdet
         | 
| 456 | 
            +
                    else:
         | 
| 457 | 
            +
                        x1 = (x1 - m) * torch.exp(-logs) * x_mask
         | 
| 458 | 
            +
                        x = torch.cat([x0, x1], 1)
         | 
| 459 | 
            +
                        return x
         | 
| 460 | 
            +
             | 
| 461 | 
            +
                def remove_weight_norm(self):
         | 
| 462 | 
            +
                    self.enc.remove_weight_norm()
         | 
| 463 | 
            +
             | 
| 464 | 
            +
             | 
| 465 | 
            +
            class ConvFlow(nn.Module):
         | 
| 466 | 
            +
                def __init__(
         | 
| 467 | 
            +
                    self,
         | 
| 468 | 
            +
                    in_channels,
         | 
| 469 | 
            +
                    filter_channels,
         | 
| 470 | 
            +
                    kernel_size,
         | 
| 471 | 
            +
                    n_layers,
         | 
| 472 | 
            +
                    num_bins=10,
         | 
| 473 | 
            +
                    tail_bound=5.0,
         | 
| 474 | 
            +
                ):
         | 
| 475 | 
            +
                    super().__init__()
         | 
| 476 | 
            +
                    self.in_channels = in_channels
         | 
| 477 | 
            +
                    self.filter_channels = filter_channels
         | 
| 478 | 
            +
                    self.kernel_size = kernel_size
         | 
| 479 | 
            +
                    self.n_layers = n_layers
         | 
| 480 | 
            +
                    self.num_bins = num_bins
         | 
| 481 | 
            +
                    self.tail_bound = tail_bound
         | 
| 482 | 
            +
                    self.half_channels = in_channels // 2
         | 
| 483 | 
            +
             | 
| 484 | 
            +
                    self.pre = nn.Conv1d(self.half_channels, filter_channels, 1)
         | 
| 485 | 
            +
                    self.convs = DDSConv(filter_channels, kernel_size, n_layers, p_dropout=0.0)
         | 
| 486 | 
            +
                    self.proj = nn.Conv1d(
         | 
| 487 | 
            +
                        filter_channels, self.half_channels * (num_bins * 3 - 1), 1
         | 
| 488 | 
            +
                    )
         | 
| 489 | 
            +
                    self.proj.weight.data.zero_()
         | 
| 490 | 
            +
                    self.proj.bias.data.zero_()
         | 
| 491 | 
            +
             | 
| 492 | 
            +
                def forward(self, x, x_mask, g=None, reverse=False):
         | 
| 493 | 
            +
                    x0, x1 = torch.split(x, [self.half_channels] * 2, 1)
         | 
| 494 | 
            +
                    h = self.pre(x0)
         | 
| 495 | 
            +
                    h = self.convs(h, x_mask, g=g)
         | 
| 496 | 
            +
                    h = self.proj(h) * x_mask
         | 
| 497 | 
            +
             | 
| 498 | 
            +
                    b, c, t = x0.shape
         | 
| 499 | 
            +
                    h = h.reshape(b, c, -1, t).permute(0, 1, 3, 2)  # [b, cx?, t] -> [b, c, t, ?]
         | 
| 500 | 
            +
             | 
| 501 | 
            +
                    unnormalized_widths = h[..., : self.num_bins] / math.sqrt(self.filter_channels)
         | 
| 502 | 
            +
                    unnormalized_heights = h[..., self.num_bins : 2 * self.num_bins] / math.sqrt(
         | 
| 503 | 
            +
                        self.filter_channels
         | 
| 504 | 
            +
                    )
         | 
| 505 | 
            +
                    unnormalized_derivatives = h[..., 2 * self.num_bins :]
         | 
| 506 | 
            +
             | 
| 507 | 
            +
                    x1, logabsdet = piecewise_rational_quadratic_transform(
         | 
| 508 | 
            +
                        x1,
         | 
| 509 | 
            +
                        unnormalized_widths,
         | 
| 510 | 
            +
                        unnormalized_heights,
         | 
| 511 | 
            +
                        unnormalized_derivatives,
         | 
| 512 | 
            +
                        inverse=reverse,
         | 
| 513 | 
            +
                        tails="linear",
         | 
| 514 | 
            +
                        tail_bound=self.tail_bound,
         | 
| 515 | 
            +
                    )
         | 
| 516 | 
            +
             | 
| 517 | 
            +
                    x = torch.cat([x0, x1], 1) * x_mask
         | 
| 518 | 
            +
                    logdet = torch.sum(logabsdet * x_mask, [1, 2])
         | 
| 519 | 
            +
                    if not reverse:
         | 
| 520 | 
            +
                        return x, logdet
         | 
| 521 | 
            +
                    else:
         | 
| 522 | 
            +
                        return x
         | 
    	
        lib/infer_pack/modules/F0Predictor/DioF0Predictor.py
    ADDED
    
    | @@ -0,0 +1,90 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            from lib.infer_pack.modules.F0Predictor.F0Predictor import F0Predictor
         | 
| 2 | 
            +
            import pyworld
         | 
| 3 | 
            +
            import numpy as np
         | 
| 4 | 
            +
             | 
| 5 | 
            +
             | 
| 6 | 
            +
            class DioF0Predictor(F0Predictor):
         | 
| 7 | 
            +
                def __init__(self, hop_length=512, f0_min=50, f0_max=1100, sampling_rate=44100):
         | 
| 8 | 
            +
                    self.hop_length = hop_length
         | 
| 9 | 
            +
                    self.f0_min = f0_min
         | 
| 10 | 
            +
                    self.f0_max = f0_max
         | 
| 11 | 
            +
                    self.sampling_rate = sampling_rate
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                def interpolate_f0(self, f0):
         | 
| 14 | 
            +
                    """
         | 
| 15 | 
            +
                    对F0进行插值处理
         | 
| 16 | 
            +
                    """
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                    data = np.reshape(f0, (f0.size, 1))
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                    vuv_vector = np.zeros((data.size, 1), dtype=np.float32)
         | 
| 21 | 
            +
                    vuv_vector[data > 0.0] = 1.0
         | 
| 22 | 
            +
                    vuv_vector[data <= 0.0] = 0.0
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                    ip_data = data
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                    frame_number = data.size
         | 
| 27 | 
            +
                    last_value = 0.0
         | 
| 28 | 
            +
                    for i in range(frame_number):
         | 
| 29 | 
            +
                        if data[i] <= 0.0:
         | 
| 30 | 
            +
                            j = i + 1
         | 
| 31 | 
            +
                            for j in range(i + 1, frame_number):
         | 
| 32 | 
            +
                                if data[j] > 0.0:
         | 
| 33 | 
            +
                                    break
         | 
| 34 | 
            +
                            if j < frame_number - 1:
         | 
| 35 | 
            +
                                if last_value > 0.0:
         | 
| 36 | 
            +
                                    step = (data[j] - data[i - 1]) / float(j - i)
         | 
| 37 | 
            +
                                    for k in range(i, j):
         | 
| 38 | 
            +
                                        ip_data[k] = data[i - 1] + step * (k - i + 1)
         | 
| 39 | 
            +
                                else:
         | 
| 40 | 
            +
                                    for k in range(i, j):
         | 
| 41 | 
            +
                                        ip_data[k] = data[j]
         | 
| 42 | 
            +
                            else:
         | 
| 43 | 
            +
                                for k in range(i, frame_number):
         | 
| 44 | 
            +
                                    ip_data[k] = last_value
         | 
| 45 | 
            +
                        else:
         | 
| 46 | 
            +
                            ip_data[i] = data[i]  # 这里可能存在一个没有必要的拷贝
         | 
| 47 | 
            +
                            last_value = data[i]
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                    return ip_data[:, 0], vuv_vector[:, 0]
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                def resize_f0(self, x, target_len):
         | 
| 52 | 
            +
                    source = np.array(x)
         | 
| 53 | 
            +
                    source[source < 0.001] = np.nan
         | 
| 54 | 
            +
                    target = np.interp(
         | 
| 55 | 
            +
                        np.arange(0, len(source) * target_len, len(source)) / target_len,
         | 
| 56 | 
            +
                        np.arange(0, len(source)),
         | 
| 57 | 
            +
                        source,
         | 
| 58 | 
            +
                    )
         | 
| 59 | 
            +
                    res = np.nan_to_num(target)
         | 
| 60 | 
            +
                    return res
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                def compute_f0(self, wav, p_len=None):
         | 
| 63 | 
            +
                    if p_len is None:
         | 
| 64 | 
            +
                        p_len = wav.shape[0] // self.hop_length
         | 
| 65 | 
            +
                    f0, t = pyworld.dio(
         | 
| 66 | 
            +
                        wav.astype(np.double),
         | 
| 67 | 
            +
                        fs=self.sampling_rate,
         | 
| 68 | 
            +
                        f0_floor=self.f0_min,
         | 
| 69 | 
            +
                        f0_ceil=self.f0_max,
         | 
| 70 | 
            +
                        frame_period=1000 * self.hop_length / self.sampling_rate,
         | 
| 71 | 
            +
                    )
         | 
| 72 | 
            +
                    f0 = pyworld.stonemask(wav.astype(np.double), f0, t, self.sampling_rate)
         | 
| 73 | 
            +
                    for index, pitch in enumerate(f0):
         | 
| 74 | 
            +
                        f0[index] = round(pitch, 1)
         | 
| 75 | 
            +
                    return self.interpolate_f0(self.resize_f0(f0, p_len))[0]
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                def compute_f0_uv(self, wav, p_len=None):
         | 
| 78 | 
            +
                    if p_len is None:
         | 
| 79 | 
            +
                        p_len = wav.shape[0] // self.hop_length
         | 
| 80 | 
            +
                    f0, t = pyworld.dio(
         | 
| 81 | 
            +
                        wav.astype(np.double),
         | 
| 82 | 
            +
                        fs=self.sampling_rate,
         | 
| 83 | 
            +
                        f0_floor=self.f0_min,
         | 
| 84 | 
            +
                        f0_ceil=self.f0_max,
         | 
| 85 | 
            +
                        frame_period=1000 * self.hop_length / self.sampling_rate,
         | 
| 86 | 
            +
                    )
         | 
| 87 | 
            +
                    f0 = pyworld.stonemask(wav.astype(np.double), f0, t, self.sampling_rate)
         | 
| 88 | 
            +
                    for index, pitch in enumerate(f0):
         | 
| 89 | 
            +
                        f0[index] = round(pitch, 1)
         | 
| 90 | 
            +
                    return self.interpolate_f0(self.resize_f0(f0, p_len))
         | 
    	
        lib/infer_pack/modules/F0Predictor/F0Predictor.py
    ADDED
    
    | @@ -0,0 +1,16 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            class F0Predictor(object):
         | 
| 2 | 
            +
                def compute_f0(self, wav, p_len):
         | 
| 3 | 
            +
                    """
         | 
| 4 | 
            +
                    input: wav:[signal_length]
         | 
| 5 | 
            +
                           p_len:int
         | 
| 6 | 
            +
                    output: f0:[signal_length//hop_length]
         | 
| 7 | 
            +
                    """
         | 
| 8 | 
            +
                    pass
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                def compute_f0_uv(self, wav, p_len):
         | 
| 11 | 
            +
                    """
         | 
| 12 | 
            +
                    input: wav:[signal_length]
         | 
| 13 | 
            +
                           p_len:int
         | 
| 14 | 
            +
                    output: f0:[signal_length//hop_length],uv:[signal_length//hop_length]
         | 
| 15 | 
            +
                    """
         | 
| 16 | 
            +
                    pass
         | 
    	
        lib/infer_pack/modules/F0Predictor/HarvestF0Predictor.py
    ADDED
    
    | @@ -0,0 +1,86 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            from lib.infer_pack.modules.F0Predictor.F0Predictor import F0Predictor
         | 
| 2 | 
            +
            import pyworld
         | 
| 3 | 
            +
            import numpy as np
         | 
| 4 | 
            +
             | 
| 5 | 
            +
             | 
| 6 | 
            +
            class HarvestF0Predictor(F0Predictor):
         | 
| 7 | 
            +
                def __init__(self, hop_length=512, f0_min=50, f0_max=1100, sampling_rate=44100):
         | 
| 8 | 
            +
                    self.hop_length = hop_length
         | 
| 9 | 
            +
                    self.f0_min = f0_min
         | 
| 10 | 
            +
                    self.f0_max = f0_max
         | 
| 11 | 
            +
                    self.sampling_rate = sampling_rate
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                def interpolate_f0(self, f0):
         | 
| 14 | 
            +
                    """
         | 
| 15 | 
            +
                    对F0进行插值处理
         | 
| 16 | 
            +
                    """
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                    data = np.reshape(f0, (f0.size, 1))
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                    vuv_vector = np.zeros((data.size, 1), dtype=np.float32)
         | 
| 21 | 
            +
                    vuv_vector[data > 0.0] = 1.0
         | 
| 22 | 
            +
                    vuv_vector[data <= 0.0] = 0.0
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                    ip_data = data
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                    frame_number = data.size
         | 
| 27 | 
            +
                    last_value = 0.0
         | 
| 28 | 
            +
                    for i in range(frame_number):
         | 
| 29 | 
            +
                        if data[i] <= 0.0:
         | 
| 30 | 
            +
                            j = i + 1
         | 
| 31 | 
            +
                            for j in range(i + 1, frame_number):
         | 
| 32 | 
            +
                                if data[j] > 0.0:
         | 
| 33 | 
            +
                                    break
         | 
| 34 | 
            +
                            if j < frame_number - 1:
         | 
| 35 | 
            +
                                if last_value > 0.0:
         | 
| 36 | 
            +
                                    step = (data[j] - data[i - 1]) / float(j - i)
         | 
| 37 | 
            +
                                    for k in range(i, j):
         | 
| 38 | 
            +
                                        ip_data[k] = data[i - 1] + step * (k - i + 1)
         | 
| 39 | 
            +
                                else:
         | 
| 40 | 
            +
                                    for k in range(i, j):
         | 
| 41 | 
            +
                                        ip_data[k] = data[j]
         | 
| 42 | 
            +
                            else:
         | 
| 43 | 
            +
                                for k in range(i, frame_number):
         | 
| 44 | 
            +
                                    ip_data[k] = last_value
         | 
| 45 | 
            +
                        else:
         | 
| 46 | 
            +
                            ip_data[i] = data[i]  # 这里可能存在一个没有必要的拷贝
         | 
| 47 | 
            +
                            last_value = data[i]
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                    return ip_data[:, 0], vuv_vector[:, 0]
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                def resize_f0(self, x, target_len):
         | 
| 52 | 
            +
                    source = np.array(x)
         | 
| 53 | 
            +
                    source[source < 0.001] = np.nan
         | 
| 54 | 
            +
                    target = np.interp(
         | 
| 55 | 
            +
                        np.arange(0, len(source) * target_len, len(source)) / target_len,
         | 
| 56 | 
            +
                        np.arange(0, len(source)),
         | 
| 57 | 
            +
                        source,
         | 
| 58 | 
            +
                    )
         | 
| 59 | 
            +
                    res = np.nan_to_num(target)
         | 
| 60 | 
            +
                    return res
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                def compute_f0(self, wav, p_len=None):
         | 
| 63 | 
            +
                    if p_len is None:
         | 
| 64 | 
            +
                        p_len = wav.shape[0] // self.hop_length
         | 
| 65 | 
            +
                    f0, t = pyworld.harvest(
         | 
| 66 | 
            +
                        wav.astype(np.double),
         | 
| 67 | 
            +
                        fs=self.hop_length,
         | 
| 68 | 
            +
                        f0_ceil=self.f0_max,
         | 
| 69 | 
            +
                        f0_floor=self.f0_min,
         | 
| 70 | 
            +
                        frame_period=1000 * self.hop_length / self.sampling_rate,
         | 
| 71 | 
            +
                    )
         | 
| 72 | 
            +
                    f0 = pyworld.stonemask(wav.astype(np.double), f0, t, self.fs)
         | 
| 73 | 
            +
                    return self.interpolate_f0(self.resize_f0(f0, p_len))[0]
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                def compute_f0_uv(self, wav, p_len=None):
         | 
| 76 | 
            +
                    if p_len is None:
         | 
| 77 | 
            +
                        p_len = wav.shape[0] // self.hop_length
         | 
| 78 | 
            +
                    f0, t = pyworld.harvest(
         | 
| 79 | 
            +
                        wav.astype(np.double),
         | 
| 80 | 
            +
                        fs=self.sampling_rate,
         | 
| 81 | 
            +
                        f0_floor=self.f0_min,
         | 
| 82 | 
            +
                        f0_ceil=self.f0_max,
         | 
| 83 | 
            +
                        frame_period=1000 * self.hop_length / self.sampling_rate,
         | 
| 84 | 
            +
                    )
         | 
| 85 | 
            +
                    f0 = pyworld.stonemask(wav.astype(np.double), f0, t, self.sampling_rate)
         | 
| 86 | 
            +
                    return self.interpolate_f0(self.resize_f0(f0, p_len))
         | 
    	
        lib/infer_pack/modules/F0Predictor/PMF0Predictor.py
    ADDED
    
    | @@ -0,0 +1,97 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            from lib.infer_pack.modules.F0Predictor.F0Predictor import F0Predictor
         | 
| 2 | 
            +
            import parselmouth
         | 
| 3 | 
            +
            import numpy as np
         | 
| 4 | 
            +
             | 
| 5 | 
            +
             | 
| 6 | 
            +
            class PMF0Predictor(F0Predictor):
         | 
| 7 | 
            +
                def __init__(self, hop_length=512, f0_min=50, f0_max=1100, sampling_rate=44100):
         | 
| 8 | 
            +
                    self.hop_length = hop_length
         | 
| 9 | 
            +
                    self.f0_min = f0_min
         | 
| 10 | 
            +
                    self.f0_max = f0_max
         | 
| 11 | 
            +
                    self.sampling_rate = sampling_rate
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                def interpolate_f0(self, f0):
         | 
| 14 | 
            +
                    """
         | 
| 15 | 
            +
                    对F0进行插值处理
         | 
| 16 | 
            +
                    """
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                    data = np.reshape(f0, (f0.size, 1))
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                    vuv_vector = np.zeros((data.size, 1), dtype=np.float32)
         | 
| 21 | 
            +
                    vuv_vector[data > 0.0] = 1.0
         | 
| 22 | 
            +
                    vuv_vector[data <= 0.0] = 0.0
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                    ip_data = data
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                    frame_number = data.size
         | 
| 27 | 
            +
                    last_value = 0.0
         | 
| 28 | 
            +
                    for i in range(frame_number):
         | 
| 29 | 
            +
                        if data[i] <= 0.0:
         | 
| 30 | 
            +
                            j = i + 1
         | 
| 31 | 
            +
                            for j in range(i + 1, frame_number):
         | 
| 32 | 
            +
                                if data[j] > 0.0:
         | 
| 33 | 
            +
                                    break
         | 
| 34 | 
            +
                            if j < frame_number - 1:
         | 
| 35 | 
            +
                                if last_value > 0.0:
         | 
| 36 | 
            +
                                    step = (data[j] - data[i - 1]) / float(j - i)
         | 
| 37 | 
            +
                                    for k in range(i, j):
         | 
| 38 | 
            +
                                        ip_data[k] = data[i - 1] + step * (k - i + 1)
         | 
| 39 | 
            +
                                else:
         | 
| 40 | 
            +
                                    for k in range(i, j):
         | 
| 41 | 
            +
                                        ip_data[k] = data[j]
         | 
| 42 | 
            +
                            else:
         | 
| 43 | 
            +
                                for k in range(i, frame_number):
         | 
| 44 | 
            +
                                    ip_data[k] = last_value
         | 
| 45 | 
            +
                        else:
         | 
| 46 | 
            +
                            ip_data[i] = data[i]  # 这里可能存在一个没有必要的拷贝
         | 
| 47 | 
            +
                            last_value = data[i]
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                    return ip_data[:, 0], vuv_vector[:, 0]
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                def compute_f0(self, wav, p_len=None):
         | 
| 52 | 
            +
                    x = wav
         | 
| 53 | 
            +
                    if p_len is None:
         | 
| 54 | 
            +
                        p_len = x.shape[0] // self.hop_length
         | 
| 55 | 
            +
                    else:
         | 
| 56 | 
            +
                        assert abs(p_len - x.shape[0] // self.hop_length) < 4, "pad length error"
         | 
| 57 | 
            +
                    time_step = self.hop_length / self.sampling_rate * 1000
         | 
| 58 | 
            +
                    f0 = (
         | 
| 59 | 
            +
                        parselmouth.Sound(x, self.sampling_rate)
         | 
| 60 | 
            +
                        .to_pitch_ac(
         | 
| 61 | 
            +
                            time_step=time_step / 1000,
         | 
| 62 | 
            +
                            voicing_threshold=0.6,
         | 
| 63 | 
            +
                            pitch_floor=self.f0_min,
         | 
| 64 | 
            +
                            pitch_ceiling=self.f0_max,
         | 
| 65 | 
            +
                        )
         | 
| 66 | 
            +
                        .selected_array["frequency"]
         | 
| 67 | 
            +
                    )
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                    pad_size = (p_len - len(f0) + 1) // 2
         | 
| 70 | 
            +
                    if pad_size > 0 or p_len - len(f0) - pad_size > 0:
         | 
| 71 | 
            +
                        f0 = np.pad(f0, [[pad_size, p_len - len(f0) - pad_size]], mode="constant")
         | 
| 72 | 
            +
                    f0, uv = self.interpolate_f0(f0)
         | 
| 73 | 
            +
                    return f0
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                def compute_f0_uv(self, wav, p_len=None):
         | 
| 76 | 
            +
                    x = wav
         | 
| 77 | 
            +
                    if p_len is None:
         | 
| 78 | 
            +
                        p_len = x.shape[0] // self.hop_length
         | 
| 79 | 
            +
                    else:
         | 
| 80 | 
            +
                        assert abs(p_len - x.shape[0] // self.hop_length) < 4, "pad length error"
         | 
| 81 | 
            +
                    time_step = self.hop_length / self.sampling_rate * 1000
         | 
| 82 | 
            +
                    f0 = (
         | 
| 83 | 
            +
                        parselmouth.Sound(x, self.sampling_rate)
         | 
| 84 | 
            +
                        .to_pitch_ac(
         | 
| 85 | 
            +
                            time_step=time_step / 1000,
         | 
| 86 | 
            +
                            voicing_threshold=0.6,
         | 
| 87 | 
            +
                            pitch_floor=self.f0_min,
         | 
| 88 | 
            +
                            pitch_ceiling=self.f0_max,
         | 
| 89 | 
            +
                        )
         | 
| 90 | 
            +
                        .selected_array["frequency"]
         | 
| 91 | 
            +
                    )
         | 
| 92 | 
            +
             | 
| 93 | 
            +
                    pad_size = (p_len - len(f0) + 1) // 2
         | 
| 94 | 
            +
                    if pad_size > 0 or p_len - len(f0) - pad_size > 0:
         | 
| 95 | 
            +
                        f0 = np.pad(f0, [[pad_size, p_len - len(f0) - pad_size]], mode="constant")
         | 
| 96 | 
            +
                    f0, uv = self.interpolate_f0(f0)
         | 
| 97 | 
            +
                    return f0, uv
         | 
    	
        lib/infer_pack/modules/F0Predictor/__init__.py
    ADDED
    
    | 
            File without changes
         | 
    	
        lib/infer_pack/onnx_inference.py
    ADDED
    
    | @@ -0,0 +1,145 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            import onnxruntime
         | 
| 2 | 
            +
            import librosa
         | 
| 3 | 
            +
            import numpy as np
         | 
| 4 | 
            +
            import soundfile
         | 
| 5 | 
            +
             | 
| 6 | 
            +
             | 
| 7 | 
            +
            class ContentVec:
         | 
| 8 | 
            +
                def __init__(self, vec_path="pretrained/vec-768-layer-12.onnx", device=None):
         | 
| 9 | 
            +
                    print("load model(s) from {}".format(vec_path))
         | 
| 10 | 
            +
                    if device == "cpu" or device is None:
         | 
| 11 | 
            +
                        providers = ["CPUExecutionProvider"]
         | 
| 12 | 
            +
                    elif device == "cuda":
         | 
| 13 | 
            +
                        providers = ["CUDAExecutionProvider", "CPUExecutionProvider"]
         | 
| 14 | 
            +
                    elif device == "dml":
         | 
| 15 | 
            +
                        providers = ["DmlExecutionProvider"]
         | 
| 16 | 
            +
                    else:
         | 
| 17 | 
            +
                        raise RuntimeError("Unsportted Device")
         | 
| 18 | 
            +
                    self.model = onnxruntime.InferenceSession(vec_path, providers=providers)
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                def __call__(self, wav):
         | 
| 21 | 
            +
                    return self.forward(wav)
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                def forward(self, wav):
         | 
| 24 | 
            +
                    feats = wav
         | 
| 25 | 
            +
                    if feats.ndim == 2:  # double channels
         | 
| 26 | 
            +
                        feats = feats.mean(-1)
         | 
| 27 | 
            +
                    assert feats.ndim == 1, feats.ndim
         | 
| 28 | 
            +
                    feats = np.expand_dims(np.expand_dims(feats, 0), 0)
         | 
| 29 | 
            +
                    onnx_input = {self.model.get_inputs()[0].name: feats}
         | 
| 30 | 
            +
                    logits = self.model.run(None, onnx_input)[0]
         | 
| 31 | 
            +
                    return logits.transpose(0, 2, 1)
         | 
| 32 | 
            +
             | 
| 33 | 
            +
             | 
| 34 | 
            +
            def get_f0_predictor(f0_predictor, hop_length, sampling_rate, **kargs):
         | 
| 35 | 
            +
                if f0_predictor == "pm":
         | 
| 36 | 
            +
                    from lib.infer_pack.modules.F0Predictor.PMF0Predictor import PMF0Predictor
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                    f0_predictor_object = PMF0Predictor(
         | 
| 39 | 
            +
                        hop_length=hop_length, sampling_rate=sampling_rate
         | 
| 40 | 
            +
                    )
         | 
| 41 | 
            +
                elif f0_predictor == "harvest":
         | 
| 42 | 
            +
                    from lib.infer_pack.modules.F0Predictor.HarvestF0Predictor import (
         | 
| 43 | 
            +
                        HarvestF0Predictor,
         | 
| 44 | 
            +
                    )
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                    f0_predictor_object = HarvestF0Predictor(
         | 
| 47 | 
            +
                        hop_length=hop_length, sampling_rate=sampling_rate
         | 
| 48 | 
            +
                    )
         | 
| 49 | 
            +
                elif f0_predictor == "dio":
         | 
| 50 | 
            +
                    from lib.infer_pack.modules.F0Predictor.DioF0Predictor import DioF0Predictor
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                    f0_predictor_object = DioF0Predictor(
         | 
| 53 | 
            +
                        hop_length=hop_length, sampling_rate=sampling_rate
         | 
| 54 | 
            +
                    )
         | 
| 55 | 
            +
                else:
         | 
| 56 | 
            +
                    raise Exception("Unknown f0 predictor")
         | 
| 57 | 
            +
                return f0_predictor_object
         | 
| 58 | 
            +
             | 
| 59 | 
            +
             | 
| 60 | 
            +
            class OnnxRVC:
         | 
| 61 | 
            +
                def __init__(
         | 
| 62 | 
            +
                    self,
         | 
| 63 | 
            +
                    model_path,
         | 
| 64 | 
            +
                    sr=40000,
         | 
| 65 | 
            +
                    hop_size=512,
         | 
| 66 | 
            +
                    vec_path="vec-768-layer-12",
         | 
| 67 | 
            +
                    device="cpu",
         | 
| 68 | 
            +
                ):
         | 
| 69 | 
            +
                    vec_path = f"pretrained/{vec_path}.onnx"
         | 
| 70 | 
            +
                    self.vec_model = ContentVec(vec_path, device)
         | 
| 71 | 
            +
                    if device == "cpu" or device is None:
         | 
| 72 | 
            +
                        providers = ["CPUExecutionProvider"]
         | 
| 73 | 
            +
                    elif device == "cuda":
         | 
| 74 | 
            +
                        providers = ["CUDAExecutionProvider", "CPUExecutionProvider"]
         | 
| 75 | 
            +
                    elif device == "dml":
         | 
| 76 | 
            +
                        providers = ["DmlExecutionProvider"]
         | 
| 77 | 
            +
                    else:
         | 
| 78 | 
            +
                        raise RuntimeError("Unsportted Device")
         | 
| 79 | 
            +
                    self.model = onnxruntime.InferenceSession(model_path, providers=providers)
         | 
| 80 | 
            +
                    self.sampling_rate = sr
         | 
| 81 | 
            +
                    self.hop_size = hop_size
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                def forward(self, hubert, hubert_length, pitch, pitchf, ds, rnd):
         | 
| 84 | 
            +
                    onnx_input = {
         | 
| 85 | 
            +
                        self.model.get_inputs()[0].name: hubert,
         | 
| 86 | 
            +
                        self.model.get_inputs()[1].name: hubert_length,
         | 
| 87 | 
            +
                        self.model.get_inputs()[2].name: pitch,
         | 
| 88 | 
            +
                        self.model.get_inputs()[3].name: pitchf,
         | 
| 89 | 
            +
                        self.model.get_inputs()[4].name: ds,
         | 
| 90 | 
            +
                        self.model.get_inputs()[5].name: rnd,
         | 
| 91 | 
            +
                    }
         | 
| 92 | 
            +
                    return (self.model.run(None, onnx_input)[0] * 32767).astype(np.int16)
         | 
| 93 | 
            +
             | 
| 94 | 
            +
                def inference(
         | 
| 95 | 
            +
                    self,
         | 
| 96 | 
            +
                    raw_path,
         | 
| 97 | 
            +
                    sid,
         | 
| 98 | 
            +
                    f0_method="dio",
         | 
| 99 | 
            +
                    f0_up_key=0,
         | 
| 100 | 
            +
                    pad_time=0.5,
         | 
| 101 | 
            +
                    cr_threshold=0.02,
         | 
| 102 | 
            +
                ):
         | 
| 103 | 
            +
                    f0_min = 50
         | 
| 104 | 
            +
                    f0_max = 1100
         | 
| 105 | 
            +
                    f0_mel_min = 1127 * np.log(1 + f0_min / 700)
         | 
| 106 | 
            +
                    f0_mel_max = 1127 * np.log(1 + f0_max / 700)
         | 
| 107 | 
            +
                    f0_predictor = get_f0_predictor(
         | 
| 108 | 
            +
                        f0_method,
         | 
| 109 | 
            +
                        hop_length=self.hop_size,
         | 
| 110 | 
            +
                        sampling_rate=self.sampling_rate,
         | 
| 111 | 
            +
                        threshold=cr_threshold,
         | 
| 112 | 
            +
                    )
         | 
| 113 | 
            +
                    wav, sr = librosa.load(raw_path, sr=self.sampling_rate)
         | 
| 114 | 
            +
                    org_length = len(wav)
         | 
| 115 | 
            +
                    if org_length / sr > 50.0:
         | 
| 116 | 
            +
                        raise RuntimeError("Reached Max Length")
         | 
| 117 | 
            +
             | 
| 118 | 
            +
                    wav16k = librosa.resample(wav, orig_sr=self.sampling_rate, target_sr=16000)
         | 
| 119 | 
            +
                    wav16k = wav16k
         | 
| 120 | 
            +
             | 
| 121 | 
            +
                    hubert = self.vec_model(wav16k)
         | 
| 122 | 
            +
                    hubert = np.repeat(hubert, 2, axis=2).transpose(0, 2, 1).astype(np.float32)
         | 
| 123 | 
            +
                    hubert_length = hubert.shape[1]
         | 
| 124 | 
            +
             | 
| 125 | 
            +
                    pitchf = f0_predictor.compute_f0(wav, hubert_length)
         | 
| 126 | 
            +
                    pitchf = pitchf * 2 ** (f0_up_key / 12)
         | 
| 127 | 
            +
                    pitch = pitchf.copy()
         | 
| 128 | 
            +
                    f0_mel = 1127 * np.log(1 + pitch / 700)
         | 
| 129 | 
            +
                    f0_mel[f0_mel > 0] = (f0_mel[f0_mel > 0] - f0_mel_min) * 254 / (
         | 
| 130 | 
            +
                        f0_mel_max - f0_mel_min
         | 
| 131 | 
            +
                    ) + 1
         | 
| 132 | 
            +
                    f0_mel[f0_mel <= 1] = 1
         | 
| 133 | 
            +
                    f0_mel[f0_mel > 255] = 255
         | 
| 134 | 
            +
                    pitch = np.rint(f0_mel).astype(np.int64)
         | 
| 135 | 
            +
             | 
| 136 | 
            +
                    pitchf = pitchf.reshape(1, len(pitchf)).astype(np.float32)
         | 
| 137 | 
            +
                    pitch = pitch.reshape(1, len(pitch))
         | 
| 138 | 
            +
                    ds = np.array([sid]).astype(np.int64)
         | 
| 139 | 
            +
             | 
| 140 | 
            +
                    rnd = np.random.randn(1, 192, hubert_length).astype(np.float32)
         | 
| 141 | 
            +
                    hubert_length = np.array([hubert_length]).astype(np.int64)
         | 
| 142 | 
            +
             | 
| 143 | 
            +
                    out_wav = self.forward(hubert, hubert_length, pitch, pitchf, ds, rnd).squeeze()
         | 
| 144 | 
            +
                    out_wav = np.pad(out_wav, (0, 2 * self.hop_size), "constant")
         | 
| 145 | 
            +
                    return out_wav[0:org_length]
         | 
    	
        lib/infer_pack/transforms.py
    ADDED
    
    | @@ -0,0 +1,209 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            import torch
         | 
| 2 | 
            +
            from torch.nn import functional as F
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            import numpy as np
         | 
| 5 | 
            +
             | 
| 6 | 
            +
             | 
| 7 | 
            +
            DEFAULT_MIN_BIN_WIDTH = 1e-3
         | 
| 8 | 
            +
            DEFAULT_MIN_BIN_HEIGHT = 1e-3
         | 
| 9 | 
            +
            DEFAULT_MIN_DERIVATIVE = 1e-3
         | 
| 10 | 
            +
             | 
| 11 | 
            +
             | 
| 12 | 
            +
            def piecewise_rational_quadratic_transform(
         | 
| 13 | 
            +
                inputs,
         | 
| 14 | 
            +
                unnormalized_widths,
         | 
| 15 | 
            +
                unnormalized_heights,
         | 
| 16 | 
            +
                unnormalized_derivatives,
         | 
| 17 | 
            +
                inverse=False,
         | 
| 18 | 
            +
                tails=None,
         | 
| 19 | 
            +
                tail_bound=1.0,
         | 
| 20 | 
            +
                min_bin_width=DEFAULT_MIN_BIN_WIDTH,
         | 
| 21 | 
            +
                min_bin_height=DEFAULT_MIN_BIN_HEIGHT,
         | 
| 22 | 
            +
                min_derivative=DEFAULT_MIN_DERIVATIVE,
         | 
| 23 | 
            +
            ):
         | 
| 24 | 
            +
                if tails is None:
         | 
| 25 | 
            +
                    spline_fn = rational_quadratic_spline
         | 
| 26 | 
            +
                    spline_kwargs = {}
         | 
| 27 | 
            +
                else:
         | 
| 28 | 
            +
                    spline_fn = unconstrained_rational_quadratic_spline
         | 
| 29 | 
            +
                    spline_kwargs = {"tails": tails, "tail_bound": tail_bound}
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                outputs, logabsdet = spline_fn(
         | 
| 32 | 
            +
                    inputs=inputs,
         | 
| 33 | 
            +
                    unnormalized_widths=unnormalized_widths,
         | 
| 34 | 
            +
                    unnormalized_heights=unnormalized_heights,
         | 
| 35 | 
            +
                    unnormalized_derivatives=unnormalized_derivatives,
         | 
| 36 | 
            +
                    inverse=inverse,
         | 
| 37 | 
            +
                    min_bin_width=min_bin_width,
         | 
| 38 | 
            +
                    min_bin_height=min_bin_height,
         | 
| 39 | 
            +
                    min_derivative=min_derivative,
         | 
| 40 | 
            +
                    **spline_kwargs
         | 
| 41 | 
            +
                )
         | 
| 42 | 
            +
                return outputs, logabsdet
         | 
| 43 | 
            +
             | 
| 44 | 
            +
             | 
| 45 | 
            +
            def searchsorted(bin_locations, inputs, eps=1e-6):
         | 
| 46 | 
            +
                bin_locations[..., -1] += eps
         | 
| 47 | 
            +
                return torch.sum(inputs[..., None] >= bin_locations, dim=-1) - 1
         | 
| 48 | 
            +
             | 
| 49 | 
            +
             | 
| 50 | 
            +
            def unconstrained_rational_quadratic_spline(
         | 
| 51 | 
            +
                inputs,
         | 
| 52 | 
            +
                unnormalized_widths,
         | 
| 53 | 
            +
                unnormalized_heights,
         | 
| 54 | 
            +
                unnormalized_derivatives,
         | 
| 55 | 
            +
                inverse=False,
         | 
| 56 | 
            +
                tails="linear",
         | 
| 57 | 
            +
                tail_bound=1.0,
         | 
| 58 | 
            +
                min_bin_width=DEFAULT_MIN_BIN_WIDTH,
         | 
| 59 | 
            +
                min_bin_height=DEFAULT_MIN_BIN_HEIGHT,
         | 
| 60 | 
            +
                min_derivative=DEFAULT_MIN_DERIVATIVE,
         | 
| 61 | 
            +
            ):
         | 
| 62 | 
            +
                inside_interval_mask = (inputs >= -tail_bound) & (inputs <= tail_bound)
         | 
| 63 | 
            +
                outside_interval_mask = ~inside_interval_mask
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                outputs = torch.zeros_like(inputs)
         | 
| 66 | 
            +
                logabsdet = torch.zeros_like(inputs)
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                if tails == "linear":
         | 
| 69 | 
            +
                    unnormalized_derivatives = F.pad(unnormalized_derivatives, pad=(1, 1))
         | 
| 70 | 
            +
                    constant = np.log(np.exp(1 - min_derivative) - 1)
         | 
| 71 | 
            +
                    unnormalized_derivatives[..., 0] = constant
         | 
| 72 | 
            +
                    unnormalized_derivatives[..., -1] = constant
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                    outputs[outside_interval_mask] = inputs[outside_interval_mask]
         | 
| 75 | 
            +
                    logabsdet[outside_interval_mask] = 0
         | 
| 76 | 
            +
                else:
         | 
| 77 | 
            +
                    raise RuntimeError("{} tails are not implemented.".format(tails))
         | 
| 78 | 
            +
             | 
| 79 | 
            +
                (
         | 
| 80 | 
            +
                    outputs[inside_interval_mask],
         | 
| 81 | 
            +
                    logabsdet[inside_interval_mask],
         | 
| 82 | 
            +
                ) = rational_quadratic_spline(
         | 
| 83 | 
            +
                    inputs=inputs[inside_interval_mask],
         | 
| 84 | 
            +
                    unnormalized_widths=unnormalized_widths[inside_interval_mask, :],
         | 
| 85 | 
            +
                    unnormalized_heights=unnormalized_heights[inside_interval_mask, :],
         | 
| 86 | 
            +
                    unnormalized_derivatives=unnormalized_derivatives[inside_interval_mask, :],
         | 
| 87 | 
            +
                    inverse=inverse,
         | 
| 88 | 
            +
                    left=-tail_bound,
         | 
| 89 | 
            +
                    right=tail_bound,
         | 
| 90 | 
            +
                    bottom=-tail_bound,
         | 
| 91 | 
            +
                    top=tail_bound,
         | 
| 92 | 
            +
                    min_bin_width=min_bin_width,
         | 
| 93 | 
            +
                    min_bin_height=min_bin_height,
         | 
| 94 | 
            +
                    min_derivative=min_derivative,
         | 
| 95 | 
            +
                )
         | 
| 96 | 
            +
             | 
| 97 | 
            +
                return outputs, logabsdet
         | 
| 98 | 
            +
             | 
| 99 | 
            +
             | 
| 100 | 
            +
            def rational_quadratic_spline(
         | 
| 101 | 
            +
                inputs,
         | 
| 102 | 
            +
                unnormalized_widths,
         | 
| 103 | 
            +
                unnormalized_heights,
         | 
| 104 | 
            +
                unnormalized_derivatives,
         | 
| 105 | 
            +
                inverse=False,
         | 
| 106 | 
            +
                left=0.0,
         | 
| 107 | 
            +
                right=1.0,
         | 
| 108 | 
            +
                bottom=0.0,
         | 
| 109 | 
            +
                top=1.0,
         | 
| 110 | 
            +
                min_bin_width=DEFAULT_MIN_BIN_WIDTH,
         | 
| 111 | 
            +
                min_bin_height=DEFAULT_MIN_BIN_HEIGHT,
         | 
| 112 | 
            +
                min_derivative=DEFAULT_MIN_DERIVATIVE,
         | 
| 113 | 
            +
            ):
         | 
| 114 | 
            +
                if torch.min(inputs) < left or torch.max(inputs) > right:
         | 
| 115 | 
            +
                    raise ValueError("Input to a transform is not within its domain")
         | 
| 116 | 
            +
             | 
| 117 | 
            +
                num_bins = unnormalized_widths.shape[-1]
         | 
| 118 | 
            +
             | 
| 119 | 
            +
                if min_bin_width * num_bins > 1.0:
         | 
| 120 | 
            +
                    raise ValueError("Minimal bin width too large for the number of bins")
         | 
| 121 | 
            +
                if min_bin_height * num_bins > 1.0:
         | 
| 122 | 
            +
                    raise ValueError("Minimal bin height too large for the number of bins")
         | 
| 123 | 
            +
             | 
| 124 | 
            +
                widths = F.softmax(unnormalized_widths, dim=-1)
         | 
| 125 | 
            +
                widths = min_bin_width + (1 - min_bin_width * num_bins) * widths
         | 
| 126 | 
            +
                cumwidths = torch.cumsum(widths, dim=-1)
         | 
| 127 | 
            +
                cumwidths = F.pad(cumwidths, pad=(1, 0), mode="constant", value=0.0)
         | 
| 128 | 
            +
                cumwidths = (right - left) * cumwidths + left
         | 
| 129 | 
            +
                cumwidths[..., 0] = left
         | 
| 130 | 
            +
                cumwidths[..., -1] = right
         | 
| 131 | 
            +
                widths = cumwidths[..., 1:] - cumwidths[..., :-1]
         | 
| 132 | 
            +
             | 
| 133 | 
            +
                derivatives = min_derivative + F.softplus(unnormalized_derivatives)
         | 
| 134 | 
            +
             | 
| 135 | 
            +
                heights = F.softmax(unnormalized_heights, dim=-1)
         | 
| 136 | 
            +
                heights = min_bin_height + (1 - min_bin_height * num_bins) * heights
         | 
| 137 | 
            +
                cumheights = torch.cumsum(heights, dim=-1)
         | 
| 138 | 
            +
                cumheights = F.pad(cumheights, pad=(1, 0), mode="constant", value=0.0)
         | 
| 139 | 
            +
                cumheights = (top - bottom) * cumheights + bottom
         | 
| 140 | 
            +
                cumheights[..., 0] = bottom
         | 
| 141 | 
            +
                cumheights[..., -1] = top
         | 
| 142 | 
            +
                heights = cumheights[..., 1:] - cumheights[..., :-1]
         | 
| 143 | 
            +
             | 
| 144 | 
            +
                if inverse:
         | 
| 145 | 
            +
                    bin_idx = searchsorted(cumheights, inputs)[..., None]
         | 
| 146 | 
            +
                else:
         | 
| 147 | 
            +
                    bin_idx = searchsorted(cumwidths, inputs)[..., None]
         | 
| 148 | 
            +
             | 
| 149 | 
            +
                input_cumwidths = cumwidths.gather(-1, bin_idx)[..., 0]
         | 
| 150 | 
            +
                input_bin_widths = widths.gather(-1, bin_idx)[..., 0]
         | 
| 151 | 
            +
             | 
| 152 | 
            +
                input_cumheights = cumheights.gather(-1, bin_idx)[..., 0]
         | 
| 153 | 
            +
                delta = heights / widths
         | 
| 154 | 
            +
                input_delta = delta.gather(-1, bin_idx)[..., 0]
         | 
| 155 | 
            +
             | 
| 156 | 
            +
                input_derivatives = derivatives.gather(-1, bin_idx)[..., 0]
         | 
| 157 | 
            +
                input_derivatives_plus_one = derivatives[..., 1:].gather(-1, bin_idx)[..., 0]
         | 
| 158 | 
            +
             | 
| 159 | 
            +
                input_heights = heights.gather(-1, bin_idx)[..., 0]
         | 
| 160 | 
            +
             | 
| 161 | 
            +
                if inverse:
         | 
| 162 | 
            +
                    a = (inputs - input_cumheights) * (
         | 
| 163 | 
            +
                        input_derivatives + input_derivatives_plus_one - 2 * input_delta
         | 
| 164 | 
            +
                    ) + input_heights * (input_delta - input_derivatives)
         | 
| 165 | 
            +
                    b = input_heights * input_derivatives - (inputs - input_cumheights) * (
         | 
| 166 | 
            +
                        input_derivatives + input_derivatives_plus_one - 2 * input_delta
         | 
| 167 | 
            +
                    )
         | 
| 168 | 
            +
                    c = -input_delta * (inputs - input_cumheights)
         | 
| 169 | 
            +
             | 
| 170 | 
            +
                    discriminant = b.pow(2) - 4 * a * c
         | 
| 171 | 
            +
                    assert (discriminant >= 0).all()
         | 
| 172 | 
            +
             | 
| 173 | 
            +
                    root = (2 * c) / (-b - torch.sqrt(discriminant))
         | 
| 174 | 
            +
                    outputs = root * input_bin_widths + input_cumwidths
         | 
| 175 | 
            +
             | 
| 176 | 
            +
                    theta_one_minus_theta = root * (1 - root)
         | 
| 177 | 
            +
                    denominator = input_delta + (
         | 
| 178 | 
            +
                        (input_derivatives + input_derivatives_plus_one - 2 * input_delta)
         | 
| 179 | 
            +
                        * theta_one_minus_theta
         | 
| 180 | 
            +
                    )
         | 
| 181 | 
            +
                    derivative_numerator = input_delta.pow(2) * (
         | 
| 182 | 
            +
                        input_derivatives_plus_one * root.pow(2)
         | 
| 183 | 
            +
                        + 2 * input_delta * theta_one_minus_theta
         | 
| 184 | 
            +
                        + input_derivatives * (1 - root).pow(2)
         | 
| 185 | 
            +
                    )
         | 
| 186 | 
            +
                    logabsdet = torch.log(derivative_numerator) - 2 * torch.log(denominator)
         | 
| 187 | 
            +
             | 
| 188 | 
            +
                    return outputs, -logabsdet
         | 
| 189 | 
            +
                else:
         | 
| 190 | 
            +
                    theta = (inputs - input_cumwidths) / input_bin_widths
         | 
| 191 | 
            +
                    theta_one_minus_theta = theta * (1 - theta)
         | 
| 192 | 
            +
             | 
| 193 | 
            +
                    numerator = input_heights * (
         | 
| 194 | 
            +
                        input_delta * theta.pow(2) + input_derivatives * theta_one_minus_theta
         | 
| 195 | 
            +
                    )
         | 
| 196 | 
            +
                    denominator = input_delta + (
         | 
| 197 | 
            +
                        (input_derivatives + input_derivatives_plus_one - 2 * input_delta)
         | 
| 198 | 
            +
                        * theta_one_minus_theta
         | 
| 199 | 
            +
                    )
         | 
| 200 | 
            +
                    outputs = input_cumheights + numerator / denominator
         | 
| 201 | 
            +
             | 
| 202 | 
            +
                    derivative_numerator = input_delta.pow(2) * (
         | 
| 203 | 
            +
                        input_derivatives_plus_one * theta.pow(2)
         | 
| 204 | 
            +
                        + 2 * input_delta * theta_one_minus_theta
         | 
| 205 | 
            +
                        + input_derivatives * (1 - theta).pow(2)
         | 
| 206 | 
            +
                    )
         | 
| 207 | 
            +
                    logabsdet = torch.log(derivative_numerator) - 2 * torch.log(denominator)
         | 
| 208 | 
            +
             | 
| 209 | 
            +
                    return outputs, logabsdet
         | 
    	
        lib/rmvpe.py
    ADDED
    
    | @@ -0,0 +1,432 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            import torch, numpy as np
         | 
| 2 | 
            +
            import torch.nn as nn
         | 
| 3 | 
            +
            import torch.nn.functional as F
         | 
| 4 | 
            +
             | 
| 5 | 
            +
             | 
| 6 | 
            +
             | 
| 7 | 
            +
            class BiGRU(nn.Module):
         | 
| 8 | 
            +
                def __init__(self, input_features, hidden_features, num_layers):
         | 
| 9 | 
            +
                    super(BiGRU, self).__init__()
         | 
| 10 | 
            +
                    self.gru = nn.GRU(
         | 
| 11 | 
            +
                        input_features,
         | 
| 12 | 
            +
                        hidden_features,
         | 
| 13 | 
            +
                        num_layers=num_layers,
         | 
| 14 | 
            +
                        batch_first=True,
         | 
| 15 | 
            +
                        bidirectional=True,
         | 
| 16 | 
            +
                    )
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                def forward(self, x):
         | 
| 19 | 
            +
                    return self.gru(x)[0]
         | 
| 20 | 
            +
             | 
| 21 | 
            +
             | 
| 22 | 
            +
            class ConvBlockRes(nn.Module):
         | 
| 23 | 
            +
                def __init__(self, in_channels, out_channels, momentum=0.01):
         | 
| 24 | 
            +
                    super(ConvBlockRes, self).__init__()
         | 
| 25 | 
            +
                    self.conv = nn.Sequential(
         | 
| 26 | 
            +
                        nn.Conv2d(
         | 
| 27 | 
            +
                            in_channels=in_channels,
         | 
| 28 | 
            +
                            out_channels=out_channels,
         | 
| 29 | 
            +
                            kernel_size=(3, 3),
         | 
| 30 | 
            +
                            stride=(1, 1),
         | 
| 31 | 
            +
                            padding=(1, 1),
         | 
| 32 | 
            +
                            bias=False,
         | 
| 33 | 
            +
                        ),
         | 
| 34 | 
            +
                        nn.BatchNorm2d(out_channels, momentum=momentum),
         | 
| 35 | 
            +
                        nn.ReLU(),
         | 
| 36 | 
            +
                        nn.Conv2d(
         | 
| 37 | 
            +
                            in_channels=out_channels,
         | 
| 38 | 
            +
                            out_channels=out_channels,
         | 
| 39 | 
            +
                            kernel_size=(3, 3),
         | 
| 40 | 
            +
                            stride=(1, 1),
         | 
| 41 | 
            +
                            padding=(1, 1),
         | 
| 42 | 
            +
                            bias=False,
         | 
| 43 | 
            +
                        ),
         | 
| 44 | 
            +
                        nn.BatchNorm2d(out_channels, momentum=momentum),
         | 
| 45 | 
            +
                        nn.ReLU(),
         | 
| 46 | 
            +
                    )
         | 
| 47 | 
            +
                    if in_channels != out_channels:
         | 
| 48 | 
            +
                        self.shortcut = nn.Conv2d(in_channels, out_channels, (1, 1))
         | 
| 49 | 
            +
                        self.is_shortcut = True
         | 
| 50 | 
            +
                    else:
         | 
| 51 | 
            +
                        self.is_shortcut = False
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                def forward(self, x):
         | 
| 54 | 
            +
                    if self.is_shortcut:
         | 
| 55 | 
            +
                        return self.conv(x) + self.shortcut(x)
         | 
| 56 | 
            +
                    else:
         | 
| 57 | 
            +
                        return self.conv(x) + x
         | 
| 58 | 
            +
             | 
| 59 | 
            +
             | 
| 60 | 
            +
            class Encoder(nn.Module):
         | 
| 61 | 
            +
                def __init__(
         | 
| 62 | 
            +
                    self,
         | 
| 63 | 
            +
                    in_channels,
         | 
| 64 | 
            +
                    in_size,
         | 
| 65 | 
            +
                    n_encoders,
         | 
| 66 | 
            +
                    kernel_size,
         | 
| 67 | 
            +
                    n_blocks,
         | 
| 68 | 
            +
                    out_channels=16,
         | 
| 69 | 
            +
                    momentum=0.01,
         | 
| 70 | 
            +
                ):
         | 
| 71 | 
            +
                    super(Encoder, self).__init__()
         | 
| 72 | 
            +
                    self.n_encoders = n_encoders
         | 
| 73 | 
            +
                    self.bn = nn.BatchNorm2d(in_channels, momentum=momentum)
         | 
| 74 | 
            +
                    self.layers = nn.ModuleList()
         | 
| 75 | 
            +
                    self.latent_channels = []
         | 
| 76 | 
            +
                    for i in range(self.n_encoders):
         | 
| 77 | 
            +
                        self.layers.append(
         | 
| 78 | 
            +
                            ResEncoderBlock(
         | 
| 79 | 
            +
                                in_channels, out_channels, kernel_size, n_blocks, momentum=momentum
         | 
| 80 | 
            +
                            )
         | 
| 81 | 
            +
                        )
         | 
| 82 | 
            +
                        self.latent_channels.append([out_channels, in_size])
         | 
| 83 | 
            +
                        in_channels = out_channels
         | 
| 84 | 
            +
                        out_channels *= 2
         | 
| 85 | 
            +
                        in_size //= 2
         | 
| 86 | 
            +
                    self.out_size = in_size
         | 
| 87 | 
            +
                    self.out_channel = out_channels
         | 
| 88 | 
            +
             | 
| 89 | 
            +
                def forward(self, x):
         | 
| 90 | 
            +
                    concat_tensors = []
         | 
| 91 | 
            +
                    x = self.bn(x)
         | 
| 92 | 
            +
                    for i in range(self.n_encoders):
         | 
| 93 | 
            +
                        _, x = self.layers[i](x)
         | 
| 94 | 
            +
                        concat_tensors.append(_)
         | 
| 95 | 
            +
                    return x, concat_tensors
         | 
| 96 | 
            +
             | 
| 97 | 
            +
             | 
| 98 | 
            +
            class ResEncoderBlock(nn.Module):
         | 
| 99 | 
            +
                def __init__(
         | 
| 100 | 
            +
                    self, in_channels, out_channels, kernel_size, n_blocks=1, momentum=0.01
         | 
| 101 | 
            +
                ):
         | 
| 102 | 
            +
                    super(ResEncoderBlock, self).__init__()
         | 
| 103 | 
            +
                    self.n_blocks = n_blocks
         | 
| 104 | 
            +
                    self.conv = nn.ModuleList()
         | 
| 105 | 
            +
                    self.conv.append(ConvBlockRes(in_channels, out_channels, momentum))
         | 
| 106 | 
            +
                    for i in range(n_blocks - 1):
         | 
| 107 | 
            +
                        self.conv.append(ConvBlockRes(out_channels, out_channels, momentum))
         | 
| 108 | 
            +
                    self.kernel_size = kernel_size
         | 
| 109 | 
            +
                    if self.kernel_size is not None:
         | 
| 110 | 
            +
                        self.pool = nn.AvgPool2d(kernel_size=kernel_size)
         | 
| 111 | 
            +
             | 
| 112 | 
            +
                def forward(self, x):
         | 
| 113 | 
            +
                    for i in range(self.n_blocks):
         | 
| 114 | 
            +
                        x = self.conv[i](x)
         | 
| 115 | 
            +
                    if self.kernel_size is not None:
         | 
| 116 | 
            +
                        return x, self.pool(x)
         | 
| 117 | 
            +
                    else:
         | 
| 118 | 
            +
                        return x
         | 
| 119 | 
            +
             | 
| 120 | 
            +
             | 
| 121 | 
            +
            class Intermediate(nn.Module):  #
         | 
| 122 | 
            +
                def __init__(self, in_channels, out_channels, n_inters, n_blocks, momentum=0.01):
         | 
| 123 | 
            +
                    super(Intermediate, self).__init__()
         | 
| 124 | 
            +
                    self.n_inters = n_inters
         | 
| 125 | 
            +
                    self.layers = nn.ModuleList()
         | 
| 126 | 
            +
                    self.layers.append(
         | 
| 127 | 
            +
                        ResEncoderBlock(in_channels, out_channels, None, n_blocks, momentum)
         | 
| 128 | 
            +
                    )
         | 
| 129 | 
            +
                    for i in range(self.n_inters - 1):
         | 
| 130 | 
            +
                        self.layers.append(
         | 
| 131 | 
            +
                            ResEncoderBlock(out_channels, out_channels, None, n_blocks, momentum)
         | 
| 132 | 
            +
                        )
         | 
| 133 | 
            +
             | 
| 134 | 
            +
                def forward(self, x):
         | 
| 135 | 
            +
                    for i in range(self.n_inters):
         | 
| 136 | 
            +
                        x = self.layers[i](x)
         | 
| 137 | 
            +
                    return x
         | 
| 138 | 
            +
             | 
| 139 | 
            +
             | 
| 140 | 
            +
            class ResDecoderBlock(nn.Module):
         | 
| 141 | 
            +
                def __init__(self, in_channels, out_channels, stride, n_blocks=1, momentum=0.01):
         | 
| 142 | 
            +
                    super(ResDecoderBlock, self).__init__()
         | 
| 143 | 
            +
                    out_padding = (0, 1) if stride == (1, 2) else (1, 1)
         | 
| 144 | 
            +
                    self.n_blocks = n_blocks
         | 
| 145 | 
            +
                    self.conv1 = nn.Sequential(
         | 
| 146 | 
            +
                        nn.ConvTranspose2d(
         | 
| 147 | 
            +
                            in_channels=in_channels,
         | 
| 148 | 
            +
                            out_channels=out_channels,
         | 
| 149 | 
            +
                            kernel_size=(3, 3),
         | 
| 150 | 
            +
                            stride=stride,
         | 
| 151 | 
            +
                            padding=(1, 1),
         | 
| 152 | 
            +
                            output_padding=out_padding,
         | 
| 153 | 
            +
                            bias=False,
         | 
| 154 | 
            +
                        ),
         | 
| 155 | 
            +
                        nn.BatchNorm2d(out_channels, momentum=momentum),
         | 
| 156 | 
            +
                        nn.ReLU(),
         | 
| 157 | 
            +
                    )
         | 
| 158 | 
            +
                    self.conv2 = nn.ModuleList()
         | 
| 159 | 
            +
                    self.conv2.append(ConvBlockRes(out_channels * 2, out_channels, momentum))
         | 
| 160 | 
            +
                    for i in range(n_blocks - 1):
         | 
| 161 | 
            +
                        self.conv2.append(ConvBlockRes(out_channels, out_channels, momentum))
         | 
| 162 | 
            +
             | 
| 163 | 
            +
                def forward(self, x, concat_tensor):
         | 
| 164 | 
            +
                    x = self.conv1(x)
         | 
| 165 | 
            +
                    x = torch.cat((x, concat_tensor), dim=1)
         | 
| 166 | 
            +
                    for i in range(self.n_blocks):
         | 
| 167 | 
            +
                        x = self.conv2[i](x)
         | 
| 168 | 
            +
                    return x
         | 
| 169 | 
            +
             | 
| 170 | 
            +
             | 
| 171 | 
            +
            class Decoder(nn.Module):
         | 
| 172 | 
            +
                def __init__(self, in_channels, n_decoders, stride, n_blocks, momentum=0.01):
         | 
| 173 | 
            +
                    super(Decoder, self).__init__()
         | 
| 174 | 
            +
                    self.layers = nn.ModuleList()
         | 
| 175 | 
            +
                    self.n_decoders = n_decoders
         | 
| 176 | 
            +
                    for i in range(self.n_decoders):
         | 
| 177 | 
            +
                        out_channels = in_channels // 2
         | 
| 178 | 
            +
                        self.layers.append(
         | 
| 179 | 
            +
                            ResDecoderBlock(in_channels, out_channels, stride, n_blocks, momentum)
         | 
| 180 | 
            +
                        )
         | 
| 181 | 
            +
                        in_channels = out_channels
         | 
| 182 | 
            +
             | 
| 183 | 
            +
                def forward(self, x, concat_tensors):
         | 
| 184 | 
            +
                    for i in range(self.n_decoders):
         | 
| 185 | 
            +
                        x = self.layers[i](x, concat_tensors[-1 - i])
         | 
| 186 | 
            +
                    return x
         | 
| 187 | 
            +
             | 
| 188 | 
            +
             | 
| 189 | 
            +
            class DeepUnet(nn.Module):
         | 
| 190 | 
            +
                def __init__(
         | 
| 191 | 
            +
                    self,
         | 
| 192 | 
            +
                    kernel_size,
         | 
| 193 | 
            +
                    n_blocks,
         | 
| 194 | 
            +
                    en_de_layers=5,
         | 
| 195 | 
            +
                    inter_layers=4,
         | 
| 196 | 
            +
                    in_channels=1,
         | 
| 197 | 
            +
                    en_out_channels=16,
         | 
| 198 | 
            +
                ):
         | 
| 199 | 
            +
                    super(DeepUnet, self).__init__()
         | 
| 200 | 
            +
                    self.encoder = Encoder(
         | 
| 201 | 
            +
                        in_channels, 128, en_de_layers, kernel_size, n_blocks, en_out_channels
         | 
| 202 | 
            +
                    )
         | 
| 203 | 
            +
                    self.intermediate = Intermediate(
         | 
| 204 | 
            +
                        self.encoder.out_channel // 2,
         | 
| 205 | 
            +
                        self.encoder.out_channel,
         | 
| 206 | 
            +
                        inter_layers,
         | 
| 207 | 
            +
                        n_blocks,
         | 
| 208 | 
            +
                    )
         | 
| 209 | 
            +
                    self.decoder = Decoder(
         | 
| 210 | 
            +
                        self.encoder.out_channel, en_de_layers, kernel_size, n_blocks
         | 
| 211 | 
            +
                    )
         | 
| 212 | 
            +
             | 
| 213 | 
            +
                def forward(self, x):
         | 
| 214 | 
            +
                    x, concat_tensors = self.encoder(x)
         | 
| 215 | 
            +
                    x = self.intermediate(x)
         | 
| 216 | 
            +
                    x = self.decoder(x, concat_tensors)
         | 
| 217 | 
            +
                    return x
         | 
| 218 | 
            +
             | 
| 219 | 
            +
             | 
| 220 | 
            +
            class E2E(nn.Module):
         | 
| 221 | 
            +
                def __init__(
         | 
| 222 | 
            +
                    self,
         | 
| 223 | 
            +
                    n_blocks,
         | 
| 224 | 
            +
                    n_gru,
         | 
| 225 | 
            +
                    kernel_size,
         | 
| 226 | 
            +
                    en_de_layers=5,
         | 
| 227 | 
            +
                    inter_layers=4,
         | 
| 228 | 
            +
                    in_channels=1,
         | 
| 229 | 
            +
                    en_out_channels=16,
         | 
| 230 | 
            +
                ):
         | 
| 231 | 
            +
                    super(E2E, self).__init__()
         | 
| 232 | 
            +
                    self.unet = DeepUnet(
         | 
| 233 | 
            +
                        kernel_size,
         | 
| 234 | 
            +
                        n_blocks,
         | 
| 235 | 
            +
                        en_de_layers,
         | 
| 236 | 
            +
                        inter_layers,
         | 
| 237 | 
            +
                        in_channels,
         | 
| 238 | 
            +
                        en_out_channels,
         | 
| 239 | 
            +
                    )
         | 
| 240 | 
            +
                    self.cnn = nn.Conv2d(en_out_channels, 3, (3, 3), padding=(1, 1))
         | 
| 241 | 
            +
                    if n_gru:
         | 
| 242 | 
            +
                        self.fc = nn.Sequential(
         | 
| 243 | 
            +
                            BiGRU(3 * 128, 256, n_gru),
         | 
| 244 | 
            +
                            nn.Linear(512, 360),
         | 
| 245 | 
            +
                            nn.Dropout(0.25),
         | 
| 246 | 
            +
                            nn.Sigmoid(),
         | 
| 247 | 
            +
                        )
         | 
| 248 | 
            +
                    else:
         | 
| 249 | 
            +
                        self.fc = nn.Sequential(
         | 
| 250 | 
            +
                            nn.Linear(3 * nn.N_MELS, nn.N_CLASS), nn.Dropout(0.25), nn.Sigmoid()
         | 
| 251 | 
            +
                        )
         | 
| 252 | 
            +
             | 
| 253 | 
            +
                def forward(self, mel):
         | 
| 254 | 
            +
                    mel = mel.transpose(-1, -2).unsqueeze(1)
         | 
| 255 | 
            +
                    x = self.cnn(self.unet(mel)).transpose(1, 2).flatten(-2)
         | 
| 256 | 
            +
                    x = self.fc(x)
         | 
| 257 | 
            +
                    return x
         | 
| 258 | 
            +
             | 
| 259 | 
            +
             | 
| 260 | 
            +
            from librosa.filters import mel
         | 
| 261 | 
            +
             | 
| 262 | 
            +
             | 
| 263 | 
            +
            class MelSpectrogram(torch.nn.Module):
         | 
| 264 | 
            +
                def __init__(
         | 
| 265 | 
            +
                    self,
         | 
| 266 | 
            +
                    is_half,
         | 
| 267 | 
            +
                    n_mel_channels,
         | 
| 268 | 
            +
                    sampling_rate,
         | 
| 269 | 
            +
                    win_length,
         | 
| 270 | 
            +
                    hop_length,
         | 
| 271 | 
            +
                    n_fft=None,
         | 
| 272 | 
            +
                    mel_fmin=0,
         | 
| 273 | 
            +
                    mel_fmax=None,
         | 
| 274 | 
            +
                    clamp=1e-5,
         | 
| 275 | 
            +
                ):
         | 
| 276 | 
            +
                    super().__init__()
         | 
| 277 | 
            +
                    n_fft = win_length if n_fft is None else n_fft
         | 
| 278 | 
            +
                    self.hann_window = {}
         | 
| 279 | 
            +
                    mel_basis = mel(
         | 
| 280 | 
            +
                        sr=sampling_rate,
         | 
| 281 | 
            +
                        n_fft=n_fft,
         | 
| 282 | 
            +
                        n_mels=n_mel_channels,
         | 
| 283 | 
            +
                        fmin=mel_fmin,
         | 
| 284 | 
            +
                        fmax=mel_fmax,
         | 
| 285 | 
            +
                        htk=True,
         | 
| 286 | 
            +
                    )
         | 
| 287 | 
            +
                    mel_basis = torch.from_numpy(mel_basis).float()
         | 
| 288 | 
            +
                    self.register_buffer("mel_basis", mel_basis)
         | 
| 289 | 
            +
                    self.n_fft = win_length if n_fft is None else n_fft
         | 
| 290 | 
            +
                    self.hop_length = hop_length
         | 
| 291 | 
            +
                    self.win_length = win_length
         | 
| 292 | 
            +
                    self.sampling_rate = sampling_rate
         | 
| 293 | 
            +
                    self.n_mel_channels = n_mel_channels
         | 
| 294 | 
            +
                    self.clamp = clamp
         | 
| 295 | 
            +
                    self.is_half = is_half
         | 
| 296 | 
            +
             | 
| 297 | 
            +
                def forward(self, audio, keyshift=0, speed=1, center=True):
         | 
| 298 | 
            +
                    factor = 2 ** (keyshift / 12)
         | 
| 299 | 
            +
                    n_fft_new = int(np.round(self.n_fft * factor))
         | 
| 300 | 
            +
                    win_length_new = int(np.round(self.win_length * factor))
         | 
| 301 | 
            +
                    hop_length_new = int(np.round(self.hop_length * speed))
         | 
| 302 | 
            +
                    keyshift_key = str(keyshift) + "_" + str(audio.device)
         | 
| 303 | 
            +
                    if keyshift_key not in self.hann_window:
         | 
| 304 | 
            +
                        self.hann_window[keyshift_key] = torch.hann_window(win_length_new).to(
         | 
| 305 | 
            +
                            audio.device
         | 
| 306 | 
            +
                        )
         | 
| 307 | 
            +
                    fft = torch.stft(
         | 
| 308 | 
            +
                        audio,
         | 
| 309 | 
            +
                        n_fft=n_fft_new,
         | 
| 310 | 
            +
                        hop_length=hop_length_new,
         | 
| 311 | 
            +
                        win_length=win_length_new,
         | 
| 312 | 
            +
                        window=self.hann_window[keyshift_key],
         | 
| 313 | 
            +
                        center=center,
         | 
| 314 | 
            +
                        return_complex=True,
         | 
| 315 | 
            +
                    )
         | 
| 316 | 
            +
                    magnitude = torch.sqrt(fft.real.pow(2) + fft.imag.pow(2))
         | 
| 317 | 
            +
                    if keyshift != 0:
         | 
| 318 | 
            +
                        size = self.n_fft // 2 + 1
         | 
| 319 | 
            +
                        resize = magnitude.size(1)
         | 
| 320 | 
            +
                        if resize < size:
         | 
| 321 | 
            +
                            magnitude = F.pad(magnitude, (0, 0, 0, size - resize))
         | 
| 322 | 
            +
                        magnitude = magnitude[:, :size, :] * self.win_length / win_length_new
         | 
| 323 | 
            +
                    mel_output = torch.matmul(self.mel_basis, magnitude)
         | 
| 324 | 
            +
                    if self.is_half == True:
         | 
| 325 | 
            +
                        mel_output = mel_output.half()
         | 
| 326 | 
            +
                    log_mel_spec = torch.log(torch.clamp(mel_output, min=self.clamp))
         | 
| 327 | 
            +
                    return log_mel_spec
         | 
| 328 | 
            +
             | 
| 329 | 
            +
             | 
| 330 | 
            +
            class RMVPE:
         | 
| 331 | 
            +
                def __init__(self, model_path, is_half, device=None):
         | 
| 332 | 
            +
                    self.resample_kernel = {}
         | 
| 333 | 
            +
                    model = E2E(4, 1, (2, 2))
         | 
| 334 | 
            +
                    ckpt = torch.load(model_path, map_location="cpu")
         | 
| 335 | 
            +
                    model.load_state_dict(ckpt)
         | 
| 336 | 
            +
                    model.eval()
         | 
| 337 | 
            +
                    if is_half == True:
         | 
| 338 | 
            +
                        model = model.half()
         | 
| 339 | 
            +
                    self.model = model
         | 
| 340 | 
            +
                    self.resample_kernel = {}
         | 
| 341 | 
            +
                    self.is_half = is_half
         | 
| 342 | 
            +
                    if device is None:
         | 
| 343 | 
            +
                        device = "cuda" if torch.cuda.is_available() else "cpu"
         | 
| 344 | 
            +
                    self.device = device
         | 
| 345 | 
            +
                    self.mel_extractor = MelSpectrogram(
         | 
| 346 | 
            +
                        is_half, 128, 16000, 1024, 160, None, 30, 8000
         | 
| 347 | 
            +
                    ).to(device)
         | 
| 348 | 
            +
                    self.model = self.model.to(device)
         | 
| 349 | 
            +
                    cents_mapping = 20 * np.arange(360) + 1997.3794084376191
         | 
| 350 | 
            +
                    self.cents_mapping = np.pad(cents_mapping, (4, 4))  # 368
         | 
| 351 | 
            +
             | 
| 352 | 
            +
                def mel2hidden(self, mel):
         | 
| 353 | 
            +
                    with torch.no_grad():
         | 
| 354 | 
            +
                        n_frames = mel.shape[-1]
         | 
| 355 | 
            +
                        mel = F.pad(
         | 
| 356 | 
            +
                            mel, (0, 32 * ((n_frames - 1) // 32 + 1) - n_frames), mode="reflect"
         | 
| 357 | 
            +
                        )
         | 
| 358 | 
            +
                        hidden = self.model(mel)
         | 
| 359 | 
            +
                        return hidden[:, :n_frames]
         | 
| 360 | 
            +
             | 
| 361 | 
            +
                def decode(self, hidden, thred=0.03):
         | 
| 362 | 
            +
                    cents_pred = self.to_local_average_cents(hidden, thred=thred)
         | 
| 363 | 
            +
                    f0 = 10 * (2 ** (cents_pred / 1200))
         | 
| 364 | 
            +
                    f0[f0 == 10] = 0
         | 
| 365 | 
            +
                    # f0 = np.array([10 * (2 ** (cent_pred / 1200)) if cent_pred else 0 for cent_pred in cents_pred])
         | 
| 366 | 
            +
                    return f0
         | 
| 367 | 
            +
             | 
| 368 | 
            +
                def infer_from_audio(self, audio, thred=0.03):
         | 
| 369 | 
            +
                    audio = torch.from_numpy(audio).float().to(self.device).unsqueeze(0)
         | 
| 370 | 
            +
                    # torch.cuda.synchronize()
         | 
| 371 | 
            +
                    # t0=ttime()
         | 
| 372 | 
            +
                    mel = self.mel_extractor(audio, center=True)
         | 
| 373 | 
            +
                    # torch.cuda.synchronize()
         | 
| 374 | 
            +
                    # t1=ttime()
         | 
| 375 | 
            +
                    hidden = self.mel2hidden(mel)
         | 
| 376 | 
            +
                    # torch.cuda.synchronize()
         | 
| 377 | 
            +
                    # t2=ttime()
         | 
| 378 | 
            +
                    hidden = hidden.squeeze(0).cpu().numpy()
         | 
| 379 | 
            +
                    if self.is_half == True:
         | 
| 380 | 
            +
                        hidden = hidden.astype("float32")
         | 
| 381 | 
            +
                    f0 = self.decode(hidden, thred=thred)
         | 
| 382 | 
            +
                    # torch.cuda.synchronize()
         | 
| 383 | 
            +
                    # t3=ttime()
         | 
| 384 | 
            +
                    # print("hmvpe:%s\t%s\t%s\t%s"%(t1-t0,t2-t1,t3-t2,t3-t0))
         | 
| 385 | 
            +
                    return f0
         | 
| 386 | 
            +
             | 
| 387 | 
            +
                def to_local_average_cents(self, salience, thred=0.05):
         | 
| 388 | 
            +
                    # t0 = ttime()
         | 
| 389 | 
            +
                    center = np.argmax(salience, axis=1)  # frame length#index
         | 
| 390 | 
            +
                    salience = np.pad(salience, ((0, 0), (4, 4)))  # frame length,368
         | 
| 391 | 
            +
                    # t1 = ttime()
         | 
| 392 | 
            +
                    center += 4
         | 
| 393 | 
            +
                    todo_salience = []
         | 
| 394 | 
            +
                    todo_cents_mapping = []
         | 
| 395 | 
            +
                    starts = center - 4
         | 
| 396 | 
            +
                    ends = center + 5
         | 
| 397 | 
            +
                    for idx in range(salience.shape[0]):
         | 
| 398 | 
            +
                        todo_salience.append(salience[:, starts[idx] : ends[idx]][idx])
         | 
| 399 | 
            +
                        todo_cents_mapping.append(self.cents_mapping[starts[idx] : ends[idx]])
         | 
| 400 | 
            +
                    # t2 = ttime()
         | 
| 401 | 
            +
                    todo_salience = np.array(todo_salience)  # frame length,9
         | 
| 402 | 
            +
                    todo_cents_mapping = np.array(todo_cents_mapping)  # frame length,9
         | 
| 403 | 
            +
                    product_sum = np.sum(todo_salience * todo_cents_mapping, 1)
         | 
| 404 | 
            +
                    weight_sum = np.sum(todo_salience, 1)  # frame length
         | 
| 405 | 
            +
                    devided = product_sum / weight_sum  # frame length
         | 
| 406 | 
            +
                    # t3 = ttime()
         | 
| 407 | 
            +
                    maxx = np.max(salience, axis=1)  # frame length
         | 
| 408 | 
            +
                    devided[maxx <= thred] = 0
         | 
| 409 | 
            +
                    # t4 = ttime()
         | 
| 410 | 
            +
                    # print("decode:%s\t%s\t%s\t%s" % (t1 - t0, t2 - t1, t3 - t2, t4 - t3))
         | 
| 411 | 
            +
                    return devided
         | 
| 412 | 
            +
             | 
| 413 | 
            +
             | 
| 414 | 
            +
            # if __name__ == '__main__':
         | 
| 415 | 
            +
            #     audio, sampling_rate = sf.read("Quotations~1.wav") ### edit
         | 
| 416 | 
            +
            #     if len(audio.shape) > 1:
         | 
| 417 | 
            +
            #         audio = librosa.to_mono(audio.transpose(1, 0))
         | 
| 418 | 
            +
            #     audio_bak = audio.copy()
         | 
| 419 | 
            +
            #     if sampling_rate != 16000:
         | 
| 420 | 
            +
            #         audio = librosa.resample(audio, orig_sr=sampling_rate, target_sr=16000)
         | 
| 421 | 
            +
            #     model_path = "/bili-coeus/jupyter/jupyterhub-liujing04/vits_ch/test-RMVPE/weights/rmvpe_llc_half.pt"
         | 
| 422 | 
            +
            #     thred = 0.03  # 0.01
         | 
| 423 | 
            +
            #     device = 'cuda' if torch.cuda.is_available() else 'cpu'
         | 
| 424 | 
            +
            #     rmvpe = RMVPE(model_path,is_half=False, device=device)
         | 
| 425 | 
            +
            #     t0=ttime()
         | 
| 426 | 
            +
            #     f0 = rmvpe.infer_from_audio(audio, thred=thred)
         | 
| 427 | 
            +
            #     f0 = rmvpe.infer_from_audio(audio, thred=thred)
         | 
| 428 | 
            +
            #     f0 = rmvpe.infer_from_audio(audio, thred=thred)
         | 
| 429 | 
            +
            #     f0 = rmvpe.infer_from_audio(audio, thred=thred)
         | 
| 430 | 
            +
            #     f0 = rmvpe.infer_from_audio(audio, thred=thred)
         | 
| 431 | 
            +
            #     t1=ttime()
         | 
| 432 | 
            +
            #     print(f0.shape,t1-t0)
         | 
    	
        requirements_colab.txt
    ADDED
    
    | @@ -0,0 +1,9 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            --extra-index-url https://download.pytorch.org/whl/cu117 torch==2.0.0+cu117 torchvision==0.15.2+cu117 torchaudio==2.0.0
         | 
| 2 | 
            +
            yt-dlp 
         | 
| 3 | 
            +
            gradio==3.35.2
         | 
| 4 | 
            +
            pydub==0.25.1
         | 
| 5 | 
            +
            edge_tts==6.1.7
         | 
| 6 | 
            +
            deep_translator==1.11.4
         | 
| 7 | 
            +
            git+https://github.com/m-bain/whisperx.git
         | 
| 8 | 
            +
            gTTS
         | 
| 9 | 
            +
            gradio_client==0.2.7
         | 
    	
        requirements_extra.txt
    ADDED
    
    | @@ -0,0 +1,8 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            praat-parselmouth>=0.4.3
         | 
| 2 | 
            +
            pyworld==0.3.2
         | 
| 3 | 
            +
            faiss-cpu==1.7.3
         | 
| 4 | 
            +
            torchcrepe==0.0.20
         | 
| 5 | 
            +
            ffmpeg-python>=0.2.0
         | 
| 6 | 
            +
            fairseq==0.12.2 
         | 
| 7 | 
            +
            gdown
         | 
| 8 | 
            +
            rarfile
         | 
    	
        soni_translate/audio_segments.py
    CHANGED
    
    | @@ -24,4 +24,4 @@ def create_translated_audio(result_diarize, audio_files, Output_name_file): | |
| 24 | 
             
                os.system("rm -rf audio/*")
         | 
| 25 |  | 
| 26 | 
             
                # combined audio as a file
         | 
| 27 | 
            -
                combined_audio.export(Output_name_file, format="wav")
         | 
|  | |
| 24 | 
             
                os.system("rm -rf audio/*")
         | 
| 25 |  | 
| 26 | 
             
                # combined audio as a file
         | 
| 27 | 
            +
                combined_audio.export(Output_name_file, format="wav") # best than ogg, change if the audio is anomalous
         | 
    	
        soni_translate/text_to_speech.py
    CHANGED
    
    | @@ -12,7 +12,7 @@ def make_voice(tts_text, tts_voice, filename,language): | |
| 12 | 
             
                  try:
         | 
| 13 | 
             
                      tts = gTTS(tts_text, lang=language)
         | 
| 14 | 
             
                      tts.save(filename)
         | 
| 15 | 
            -
                      print(f'No audio was received. Please change the tts voice for {tts_voice}.  | 
| 16 | 
             
                  except:
         | 
| 17 | 
             
                    tts = gTTS('a', lang=language)
         | 
| 18 | 
             
                    tts.save(filename)
         | 
| @@ -26,7 +26,7 @@ def make_voice_gradio(tts_text, tts_voice, filename, language): | |
| 26 | 
             
                  try:
         | 
| 27 | 
             
                    tts = gTTS(tts_text, lang=language)
         | 
| 28 | 
             
                    tts.save(filename)
         | 
| 29 | 
            -
                    print(f'No audio was received. Please change the tts voice for {tts_voice}.  | 
| 30 | 
             
                  except:
         | 
| 31 | 
             
                    tts = gTTS('a', lang=language)
         | 
| 32 | 
             
                    tts.save(filename)
         | 
|  | |
| 12 | 
             
                  try:
         | 
| 13 | 
             
                      tts = gTTS(tts_text, lang=language)
         | 
| 14 | 
             
                      tts.save(filename)
         | 
| 15 | 
            +
                      print(f'No audio was received. Please change the tts voice for {tts_voice}. TTS auxiliary will be used in the segment')
         | 
| 16 | 
             
                  except:
         | 
| 17 | 
             
                    tts = gTTS('a', lang=language)
         | 
| 18 | 
             
                    tts.save(filename)
         | 
|  | |
| 26 | 
             
                  try:
         | 
| 27 | 
             
                    tts = gTTS(tts_text, lang=language)
         | 
| 28 | 
             
                    tts.save(filename)
         | 
| 29 | 
            +
                    print(f'No audio was received. Please change the tts voice for {tts_voice}. TTS auxiliary will be used in the segment')
         | 
| 30 | 
             
                  except:
         | 
| 31 | 
             
                    tts = gTTS('a', lang=language)
         | 
| 32 | 
             
                    tts.save(filename)
         | 
    	
        soni_translate/translate_segments.py
    CHANGED
    
    | @@ -2,9 +2,6 @@ from tqdm import tqdm | |
| 2 | 
             
            from deep_translator import GoogleTranslator
         | 
| 3 |  | 
| 4 | 
             
            def translate_text(segments, TRANSLATE_AUDIO_TO):
         | 
| 5 | 
            -
             | 
| 6 | 
            -
                if TRANSLATE_AUDIO_TO == "zh":
         | 
| 7 | 
            -
                    TRANSLATE_AUDIO_TO = "zh-CN"
         | 
| 8 |  | 
| 9 | 
             
                translator = GoogleTranslator(source='auto', target=TRANSLATE_AUDIO_TO)
         | 
| 10 |  | 
|  | |
| 2 | 
             
            from deep_translator import GoogleTranslator
         | 
| 3 |  | 
| 4 | 
             
            def translate_text(segments, TRANSLATE_AUDIO_TO):
         | 
|  | |
|  | |
|  | |
| 5 |  | 
| 6 | 
             
                translator = GoogleTranslator(source='auto', target=TRANSLATE_AUDIO_TO)
         | 
| 7 |  | 
    	
        vc_infer_pipeline.py
    ADDED
    
    | @@ -0,0 +1,445 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            import numpy as np, parselmouth, torch, pdb, sys, os
         | 
| 2 | 
            +
            from time import time as ttime
         | 
| 3 | 
            +
            import torch.nn.functional as F
         | 
| 4 | 
            +
            import scipy.signal as signal
         | 
| 5 | 
            +
            import pyworld, os, traceback, faiss, librosa, torchcrepe
         | 
| 6 | 
            +
            from scipy import signal
         | 
| 7 | 
            +
            from functools import lru_cache
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            now_dir = os.getcwd()
         | 
| 10 | 
            +
            sys.path.append(now_dir)
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            bh, ah = signal.butter(N=5, Wn=48, btype="high", fs=16000)
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            input_audio_path2wav = {}
         | 
| 15 | 
            +
             | 
| 16 | 
            +
             | 
| 17 | 
            +
            @lru_cache
         | 
| 18 | 
            +
            def cache_harvest_f0(input_audio_path, fs, f0max, f0min, frame_period):
         | 
| 19 | 
            +
                audio = input_audio_path2wav[input_audio_path]
         | 
| 20 | 
            +
                f0, t = pyworld.harvest(
         | 
| 21 | 
            +
                    audio,
         | 
| 22 | 
            +
                    fs=fs,
         | 
| 23 | 
            +
                    f0_ceil=f0max,
         | 
| 24 | 
            +
                    f0_floor=f0min,
         | 
| 25 | 
            +
                    frame_period=frame_period,
         | 
| 26 | 
            +
                )
         | 
| 27 | 
            +
                f0 = pyworld.stonemask(audio, f0, t, fs)
         | 
| 28 | 
            +
                return f0
         | 
| 29 | 
            +
             | 
| 30 | 
            +
             | 
| 31 | 
            +
            def change_rms(data1, sr1, data2, sr2, rate):  # 1 is the input audio, 2 is the output audio, rate is the proportion of 2
         | 
| 32 | 
            +
                # print(data1.max(),data2.max())
         | 
| 33 | 
            +
                rms1 = librosa.feature.rms(
         | 
| 34 | 
            +
                    y=data1, frame_length=sr1 // 2 * 2, hop_length=sr1 // 2
         | 
| 35 | 
            +
                )  # one dot every half second
         | 
| 36 | 
            +
                rms2 = librosa.feature.rms(y=data2, frame_length=sr2 // 2 * 2, hop_length=sr2 // 2)
         | 
| 37 | 
            +
                rms1 = torch.from_numpy(rms1)
         | 
| 38 | 
            +
                rms1 = F.interpolate(
         | 
| 39 | 
            +
                    rms1.unsqueeze(0), size=data2.shape[0], mode="linear"
         | 
| 40 | 
            +
                ).squeeze()
         | 
| 41 | 
            +
                rms2 = torch.from_numpy(rms2)
         | 
| 42 | 
            +
                rms2 = F.interpolate(
         | 
| 43 | 
            +
                    rms2.unsqueeze(0), size=data2.shape[0], mode="linear"
         | 
| 44 | 
            +
                ).squeeze()
         | 
| 45 | 
            +
                rms2 = torch.max(rms2, torch.zeros_like(rms2) + 1e-6)
         | 
| 46 | 
            +
                data2 *= (
         | 
| 47 | 
            +
                    torch.pow(rms1, torch.tensor(1 - rate))
         | 
| 48 | 
            +
                    * torch.pow(rms2, torch.tensor(rate - 1))
         | 
| 49 | 
            +
                ).numpy()
         | 
| 50 | 
            +
                return data2
         | 
| 51 | 
            +
             | 
| 52 | 
            +
             | 
| 53 | 
            +
            class VC(object):
         | 
| 54 | 
            +
                def __init__(self, tgt_sr, config):
         | 
| 55 | 
            +
                    self.x_pad, self.x_query, self.x_center, self.x_max, self.is_half = (
         | 
| 56 | 
            +
                        config.x_pad,
         | 
| 57 | 
            +
                        config.x_query,
         | 
| 58 | 
            +
                        config.x_center,
         | 
| 59 | 
            +
                        config.x_max,
         | 
| 60 | 
            +
                        config.is_half,
         | 
| 61 | 
            +
                    )
         | 
| 62 | 
            +
                    self.sr = 16000  # hubert input sampling rate
         | 
| 63 | 
            +
                    self.window = 160  # points per frame
         | 
| 64 | 
            +
                    self.t_pad = self.sr * self.x_pad  # Pad time before and after each bar
         | 
| 65 | 
            +
                    self.t_pad_tgt = tgt_sr * self.x_pad
         | 
| 66 | 
            +
                    self.t_pad2 = self.t_pad * 2
         | 
| 67 | 
            +
                    self.t_query = self.sr * self.x_query  # Query time before and after the cut point
         | 
| 68 | 
            +
                    self.t_center = self.sr * self.x_center  # Query point cut position
         | 
| 69 | 
            +
                    self.t_max = self.sr * self.x_max  # Query-free duration threshold
         | 
| 70 | 
            +
                    self.device = config.device
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                def get_f0(
         | 
| 73 | 
            +
                    self,
         | 
| 74 | 
            +
                    input_audio_path,
         | 
| 75 | 
            +
                    x,
         | 
| 76 | 
            +
                    p_len,
         | 
| 77 | 
            +
                    f0_up_key,
         | 
| 78 | 
            +
                    f0_method,
         | 
| 79 | 
            +
                    filter_radius,
         | 
| 80 | 
            +
                    inp_f0=None,
         | 
| 81 | 
            +
                ):
         | 
| 82 | 
            +
                    global input_audio_path2wav
         | 
| 83 | 
            +
                    time_step = self.window / self.sr * 1000
         | 
| 84 | 
            +
                    f0_min = 50
         | 
| 85 | 
            +
                    f0_max = 1100
         | 
| 86 | 
            +
                    f0_mel_min = 1127 * np.log(1 + f0_min / 700)
         | 
| 87 | 
            +
                    f0_mel_max = 1127 * np.log(1 + f0_max / 700)
         | 
| 88 | 
            +
                    if f0_method == "pm":
         | 
| 89 | 
            +
                        f0 = (
         | 
| 90 | 
            +
                            parselmouth.Sound(x, self.sr)
         | 
| 91 | 
            +
                            .to_pitch_ac(
         | 
| 92 | 
            +
                                time_step=time_step / 1000,
         | 
| 93 | 
            +
                                voicing_threshold=0.6,
         | 
| 94 | 
            +
                                pitch_floor=f0_min,
         | 
| 95 | 
            +
                                pitch_ceiling=f0_max,
         | 
| 96 | 
            +
                            )
         | 
| 97 | 
            +
                            .selected_array["frequency"]
         | 
| 98 | 
            +
                        )
         | 
| 99 | 
            +
                        pad_size = (p_len - len(f0) + 1) // 2
         | 
| 100 | 
            +
                        if pad_size > 0 or p_len - len(f0) - pad_size > 0:
         | 
| 101 | 
            +
                            f0 = np.pad(
         | 
| 102 | 
            +
                                f0, [[pad_size, p_len - len(f0) - pad_size]], mode="constant"
         | 
| 103 | 
            +
                            )
         | 
| 104 | 
            +
                    elif f0_method == "harvest":
         | 
| 105 | 
            +
                        input_audio_path2wav[input_audio_path] = x.astype(np.double)
         | 
| 106 | 
            +
                        f0 = cache_harvest_f0(input_audio_path, self.sr, f0_max, f0_min, 10)
         | 
| 107 | 
            +
                        if filter_radius > 2:
         | 
| 108 | 
            +
                            f0 = signal.medfilt(f0, 3)
         | 
| 109 | 
            +
                    elif f0_method == "crepe":
         | 
| 110 | 
            +
                        model = "full"
         | 
| 111 | 
            +
                        # Pick a batch size that doesn't cause memory errors on your gpu
         | 
| 112 | 
            +
                        batch_size = 512
         | 
| 113 | 
            +
                        # Compute pitch using first gpu
         | 
| 114 | 
            +
                        audio = torch.tensor(np.copy(x))[None].float()
         | 
| 115 | 
            +
                        f0, pd = torchcrepe.predict(
         | 
| 116 | 
            +
                            audio,
         | 
| 117 | 
            +
                            self.sr,
         | 
| 118 | 
            +
                            self.window,
         | 
| 119 | 
            +
                            f0_min,
         | 
| 120 | 
            +
                            f0_max,
         | 
| 121 | 
            +
                            model,
         | 
| 122 | 
            +
                            batch_size=batch_size,
         | 
| 123 | 
            +
                            device=self.device,
         | 
| 124 | 
            +
                            return_periodicity=True,
         | 
| 125 | 
            +
                        )
         | 
| 126 | 
            +
                        pd = torchcrepe.filter.median(pd, 3)
         | 
| 127 | 
            +
                        f0 = torchcrepe.filter.mean(f0, 3)
         | 
| 128 | 
            +
                        f0[pd < 0.1] = 0
         | 
| 129 | 
            +
                        f0 = f0[0].cpu().numpy()
         | 
| 130 | 
            +
                    elif f0_method == "rmvpe":
         | 
| 131 | 
            +
                        if hasattr(self, "model_rmvpe") == False:
         | 
| 132 | 
            +
                            from lib.rmvpe import RMVPE
         | 
| 133 | 
            +
             | 
| 134 | 
            +
                            print("loading rmvpe model")
         | 
| 135 | 
            +
                            self.model_rmvpe = RMVPE(
         | 
| 136 | 
            +
                                "rmvpe.pt", is_half=self.is_half, device=self.device
         | 
| 137 | 
            +
                            )
         | 
| 138 | 
            +
                        f0 = self.model_rmvpe.infer_from_audio(x, thred=0.03)
         | 
| 139 | 
            +
                    f0 *= pow(2, f0_up_key / 12)
         | 
| 140 | 
            +
                    # with open("test.txt","w")as f:f.write("\n".join([str(i)for i in f0.tolist()]))
         | 
| 141 | 
            +
                    tf0 = self.sr // self.window  # f0 points per second
         | 
| 142 | 
            +
                    if inp_f0 is not None:
         | 
| 143 | 
            +
                        delta_t = np.round(
         | 
| 144 | 
            +
                            (inp_f0[:, 0].max() - inp_f0[:, 0].min()) * tf0 + 1
         | 
| 145 | 
            +
                        ).astype("int16")
         | 
| 146 | 
            +
                        replace_f0 = np.interp(
         | 
| 147 | 
            +
                            list(range(delta_t)), inp_f0[:, 0] * 100, inp_f0[:, 1]
         | 
| 148 | 
            +
                        )
         | 
| 149 | 
            +
                        shape = f0[self.x_pad * tf0 : self.x_pad * tf0 + len(replace_f0)].shape[0]
         | 
| 150 | 
            +
                        f0[self.x_pad * tf0 : self.x_pad * tf0 + len(replace_f0)] = replace_f0[
         | 
| 151 | 
            +
                            :shape
         | 
| 152 | 
            +
                        ]
         | 
| 153 | 
            +
                    # with open("test_opt.txt","w")as f:f.write("\n".join([str(i)for i in f0.tolist()]))
         | 
| 154 | 
            +
                    f0bak = f0.copy()
         | 
| 155 | 
            +
                    f0_mel = 1127 * np.log(1 + f0 / 700)
         | 
| 156 | 
            +
                    f0_mel[f0_mel > 0] = (f0_mel[f0_mel > 0] - f0_mel_min) * 254 / (
         | 
| 157 | 
            +
                        f0_mel_max - f0_mel_min
         | 
| 158 | 
            +
                    ) + 1
         | 
| 159 | 
            +
                    f0_mel[f0_mel <= 1] = 1
         | 
| 160 | 
            +
                    f0_mel[f0_mel > 255] = 255
         | 
| 161 | 
            +
                    f0_coarse = np.rint(f0_mel).astype(np.int)
         | 
| 162 | 
            +
                    return f0_coarse, f0bak  # 1-0
         | 
| 163 | 
            +
             | 
| 164 | 
            +
                def vc(
         | 
| 165 | 
            +
                    self,
         | 
| 166 | 
            +
                    model,
         | 
| 167 | 
            +
                    net_g,
         | 
| 168 | 
            +
                    sid,
         | 
| 169 | 
            +
                    audio0,
         | 
| 170 | 
            +
                    pitch,
         | 
| 171 | 
            +
                    pitchf,
         | 
| 172 | 
            +
                    times,
         | 
| 173 | 
            +
                    index,
         | 
| 174 | 
            +
                    big_npy,
         | 
| 175 | 
            +
                    index_rate,
         | 
| 176 | 
            +
                    version,
         | 
| 177 | 
            +
                    protect,
         | 
| 178 | 
            +
                ):  # ,file_index,file_big_npy
         | 
| 179 | 
            +
                    feats = torch.from_numpy(audio0)
         | 
| 180 | 
            +
                    if self.is_half:
         | 
| 181 | 
            +
                        feats = feats.half()
         | 
| 182 | 
            +
                    else:
         | 
| 183 | 
            +
                        feats = feats.float()
         | 
| 184 | 
            +
                    if feats.dim() == 2:  # double channels
         | 
| 185 | 
            +
                        feats = feats.mean(-1)
         | 
| 186 | 
            +
                    assert feats.dim() == 1, feats.dim()
         | 
| 187 | 
            +
                    feats = feats.view(1, -1)
         | 
| 188 | 
            +
                    padding_mask = torch.BoolTensor(feats.shape).to(self.device).fill_(False)
         | 
| 189 | 
            +
             | 
| 190 | 
            +
                    inputs = {
         | 
| 191 | 
            +
                        "source": feats.to(self.device),
         | 
| 192 | 
            +
                        "padding_mask": padding_mask,
         | 
| 193 | 
            +
                        "output_layer": 9 if version == "v1" else 12,
         | 
| 194 | 
            +
                    }
         | 
| 195 | 
            +
                    t0 = ttime()
         | 
| 196 | 
            +
                    with torch.no_grad():
         | 
| 197 | 
            +
                        logits = model.extract_features(**inputs)
         | 
| 198 | 
            +
                        feats = model.final_proj(logits[0]) if version == "v1" else logits[0]
         | 
| 199 | 
            +
                    if protect < 0.5 and pitch != None and pitchf != None:
         | 
| 200 | 
            +
                        feats0 = feats.clone()
         | 
| 201 | 
            +
                    if (
         | 
| 202 | 
            +
                        isinstance(index, type(None)) == False
         | 
| 203 | 
            +
                        and isinstance(big_npy, type(None)) == False
         | 
| 204 | 
            +
                        and index_rate != 0
         | 
| 205 | 
            +
                    ):
         | 
| 206 | 
            +
                        npy = feats[0].cpu().numpy()
         | 
| 207 | 
            +
                        if self.is_half:
         | 
| 208 | 
            +
                            npy = npy.astype("float32")
         | 
| 209 | 
            +
             | 
| 210 | 
            +
                        # _, I = index.search(npy, 1)
         | 
| 211 | 
            +
                        # npy = big_npy[I.squeeze()]
         | 
| 212 | 
            +
             | 
| 213 | 
            +
                        score, ix = index.search(npy, k=8)
         | 
| 214 | 
            +
                        weight = np.square(1 / score)
         | 
| 215 | 
            +
                        weight /= weight.sum(axis=1, keepdims=True)
         | 
| 216 | 
            +
                        npy = np.sum(big_npy[ix] * np.expand_dims(weight, axis=2), axis=1)
         | 
| 217 | 
            +
             | 
| 218 | 
            +
                        if self.is_half:
         | 
| 219 | 
            +
                            npy = npy.astype("float16")
         | 
| 220 | 
            +
                        feats = (
         | 
| 221 | 
            +
                            torch.from_numpy(npy).unsqueeze(0).to(self.device) * index_rate
         | 
| 222 | 
            +
                            + (1 - index_rate) * feats
         | 
| 223 | 
            +
                        )
         | 
| 224 | 
            +
             | 
| 225 | 
            +
                    feats = F.interpolate(feats.permute(0, 2, 1), scale_factor=2).permute(0, 2, 1)
         | 
| 226 | 
            +
                    if protect < 0.5 and pitch != None and pitchf != None:
         | 
| 227 | 
            +
                        feats0 = F.interpolate(feats0.permute(0, 2, 1), scale_factor=2).permute(
         | 
| 228 | 
            +
                            0, 2, 1
         | 
| 229 | 
            +
                        )
         | 
| 230 | 
            +
                    t1 = ttime()
         | 
| 231 | 
            +
                    p_len = audio0.shape[0] // self.window
         | 
| 232 | 
            +
                    if feats.shape[1] < p_len:
         | 
| 233 | 
            +
                        p_len = feats.shape[1]
         | 
| 234 | 
            +
                        if pitch != None and pitchf != None:
         | 
| 235 | 
            +
                            pitch = pitch[:, :p_len]
         | 
| 236 | 
            +
                            pitchf = pitchf[:, :p_len]
         | 
| 237 | 
            +
             | 
| 238 | 
            +
                    if protect < 0.5 and pitch != None and pitchf != None:
         | 
| 239 | 
            +
                        pitchff = pitchf.clone()
         | 
| 240 | 
            +
                        pitchff[pitchf > 0] = 1
         | 
| 241 | 
            +
                        pitchff[pitchf < 1] = protect
         | 
| 242 | 
            +
                        pitchff = pitchff.unsqueeze(-1)
         | 
| 243 | 
            +
                        feats = feats * pitchff + feats0 * (1 - pitchff)
         | 
| 244 | 
            +
                        feats = feats.to(feats0.dtype)
         | 
| 245 | 
            +
                    p_len = torch.tensor([p_len], device=self.device).long()
         | 
| 246 | 
            +
                    with torch.no_grad():
         | 
| 247 | 
            +
                        if pitch != None and pitchf != None:
         | 
| 248 | 
            +
                            audio1 = (
         | 
| 249 | 
            +
                                (net_g.infer(feats, p_len, pitch, pitchf, sid)[0][0, 0])
         | 
| 250 | 
            +
                                .data.cpu()
         | 
| 251 | 
            +
                                .float()
         | 
| 252 | 
            +
                                .numpy()
         | 
| 253 | 
            +
                            )
         | 
| 254 | 
            +
                        else:
         | 
| 255 | 
            +
                            audio1 = (
         | 
| 256 | 
            +
                                (net_g.infer(feats, p_len, sid)[0][0, 0]).data.cpu().float().numpy()
         | 
| 257 | 
            +
                            )
         | 
| 258 | 
            +
                    del feats, p_len, padding_mask
         | 
| 259 | 
            +
                    if torch.cuda.is_available():
         | 
| 260 | 
            +
                        torch.cuda.empty_cache()
         | 
| 261 | 
            +
                    t2 = ttime()
         | 
| 262 | 
            +
                    times[0] += t1 - t0
         | 
| 263 | 
            +
                    times[2] += t2 - t1
         | 
| 264 | 
            +
                    return audio1
         | 
| 265 | 
            +
             | 
| 266 | 
            +
                def pipeline(
         | 
| 267 | 
            +
                    self,
         | 
| 268 | 
            +
                    model,
         | 
| 269 | 
            +
                    net_g,
         | 
| 270 | 
            +
                    sid,
         | 
| 271 | 
            +
                    audio,
         | 
| 272 | 
            +
                    input_audio_path,
         | 
| 273 | 
            +
                    times,
         | 
| 274 | 
            +
                    f0_up_key,
         | 
| 275 | 
            +
                    f0_method,
         | 
| 276 | 
            +
                    file_index,
         | 
| 277 | 
            +
                    # file_big_npy,
         | 
| 278 | 
            +
                    index_rate,
         | 
| 279 | 
            +
                    if_f0,
         | 
| 280 | 
            +
                    filter_radius,
         | 
| 281 | 
            +
                    tgt_sr,
         | 
| 282 | 
            +
                    resample_sr,
         | 
| 283 | 
            +
                    rms_mix_rate,
         | 
| 284 | 
            +
                    version,
         | 
| 285 | 
            +
                    protect,
         | 
| 286 | 
            +
                    f0_file=None,
         | 
| 287 | 
            +
                ):
         | 
| 288 | 
            +
                    if (
         | 
| 289 | 
            +
                        file_index != ""
         | 
| 290 | 
            +
                        # and file_big_npy != ""
         | 
| 291 | 
            +
                        # and os.path.exists(file_big_npy) == True
         | 
| 292 | 
            +
                        and os.path.exists(file_index) == True
         | 
| 293 | 
            +
                        and index_rate != 0
         | 
| 294 | 
            +
                    ):
         | 
| 295 | 
            +
                        try:
         | 
| 296 | 
            +
                            index = faiss.read_index(file_index)
         | 
| 297 | 
            +
                            # big_npy = np.load(file_big_npy)
         | 
| 298 | 
            +
                            big_npy = index.reconstruct_n(0, index.ntotal)
         | 
| 299 | 
            +
                        except:
         | 
| 300 | 
            +
                            traceback.print_exc()
         | 
| 301 | 
            +
                            index = big_npy = None
         | 
| 302 | 
            +
                    else:
         | 
| 303 | 
            +
                        index = big_npy = None
         | 
| 304 | 
            +
                        print("File index Not found, set None")
         | 
| 305 | 
            +
             | 
| 306 | 
            +
                    audio = signal.filtfilt(bh, ah, audio)
         | 
| 307 | 
            +
                    audio_pad = np.pad(audio, (self.window // 2, self.window // 2), mode="reflect")
         | 
| 308 | 
            +
                    opt_ts = []
         | 
| 309 | 
            +
                    if audio_pad.shape[0] > self.t_max:
         | 
| 310 | 
            +
                        audio_sum = np.zeros_like(audio)
         | 
| 311 | 
            +
                        for i in range(self.window):
         | 
| 312 | 
            +
                            audio_sum += audio_pad[i : i - self.window]
         | 
| 313 | 
            +
                        for t in range(self.t_center, audio.shape[0], self.t_center):
         | 
| 314 | 
            +
                            opt_ts.append(
         | 
| 315 | 
            +
                                t
         | 
| 316 | 
            +
                                - self.t_query
         | 
| 317 | 
            +
                                + np.where(
         | 
| 318 | 
            +
                                    np.abs(audio_sum[t - self.t_query : t + self.t_query])
         | 
| 319 | 
            +
                                    == np.abs(audio_sum[t - self.t_query : t + self.t_query]).min()
         | 
| 320 | 
            +
                                )[0][0]
         | 
| 321 | 
            +
                            )
         | 
| 322 | 
            +
                    s = 0
         | 
| 323 | 
            +
                    audio_opt = []
         | 
| 324 | 
            +
                    t = None
         | 
| 325 | 
            +
                    t1 = ttime()
         | 
| 326 | 
            +
                    audio_pad = np.pad(audio, (self.t_pad, self.t_pad), mode="reflect")
         | 
| 327 | 
            +
                    p_len = audio_pad.shape[0] // self.window
         | 
| 328 | 
            +
                    inp_f0 = None
         | 
| 329 | 
            +
                    if hasattr(f0_file, "name") == True:
         | 
| 330 | 
            +
                        try:
         | 
| 331 | 
            +
                            with open(f0_file.name, "r") as f:
         | 
| 332 | 
            +
                                lines = f.read().strip("\n").split("\n")
         | 
| 333 | 
            +
                            inp_f0 = []
         | 
| 334 | 
            +
                            for line in lines:
         | 
| 335 | 
            +
                                inp_f0.append([float(i) for i in line.split(",")])
         | 
| 336 | 
            +
                            inp_f0 = np.array(inp_f0, dtype="float32")
         | 
| 337 | 
            +
                        except:
         | 
| 338 | 
            +
                            traceback.print_exc()
         | 
| 339 | 
            +
                    sid = torch.tensor(sid, device=self.device).unsqueeze(0).long()
         | 
| 340 | 
            +
                    pitch, pitchf = None, None
         | 
| 341 | 
            +
                    if if_f0 == 1:
         | 
| 342 | 
            +
                        pitch, pitchf = self.get_f0(
         | 
| 343 | 
            +
                            input_audio_path,
         | 
| 344 | 
            +
                            audio_pad,
         | 
| 345 | 
            +
                            p_len,
         | 
| 346 | 
            +
                            f0_up_key,
         | 
| 347 | 
            +
                            f0_method,
         | 
| 348 | 
            +
                            filter_radius,
         | 
| 349 | 
            +
                            inp_f0,
         | 
| 350 | 
            +
                        )
         | 
| 351 | 
            +
                        pitch = pitch[:p_len]
         | 
| 352 | 
            +
                        pitchf = pitchf[:p_len]
         | 
| 353 | 
            +
                        if self.device == "mps":
         | 
| 354 | 
            +
                            pitchf = pitchf.astype(np.float32)
         | 
| 355 | 
            +
                        pitch = torch.tensor(pitch, device=self.device).unsqueeze(0).long()
         | 
| 356 | 
            +
                        pitchf = torch.tensor(pitchf, device=self.device).unsqueeze(0).float()
         | 
| 357 | 
            +
                    t2 = ttime()
         | 
| 358 | 
            +
                    times[1] += t2 - t1
         | 
| 359 | 
            +
                    for t in opt_ts:
         | 
| 360 | 
            +
                        t = t // self.window * self.window
         | 
| 361 | 
            +
                        if if_f0 == 1:
         | 
| 362 | 
            +
                            audio_opt.append(
         | 
| 363 | 
            +
                                self.vc(
         | 
| 364 | 
            +
                                    model,
         | 
| 365 | 
            +
                                    net_g,
         | 
| 366 | 
            +
                                    sid,
         | 
| 367 | 
            +
                                    audio_pad[s : t + self.t_pad2 + self.window],
         | 
| 368 | 
            +
                                    pitch[:, s // self.window : (t + self.t_pad2) // self.window],
         | 
| 369 | 
            +
                                    pitchf[:, s // self.window : (t + self.t_pad2) // self.window],
         | 
| 370 | 
            +
                                    times,
         | 
| 371 | 
            +
                                    index,
         | 
| 372 | 
            +
                                    big_npy,
         | 
| 373 | 
            +
                                    index_rate,
         | 
| 374 | 
            +
                                    version,
         | 
| 375 | 
            +
                                    protect,
         | 
| 376 | 
            +
                                )[self.t_pad_tgt : -self.t_pad_tgt]
         | 
| 377 | 
            +
                            )
         | 
| 378 | 
            +
                        else:
         | 
| 379 | 
            +
                            audio_opt.append(
         | 
| 380 | 
            +
                                self.vc(
         | 
| 381 | 
            +
                                    model,
         | 
| 382 | 
            +
                                    net_g,
         | 
| 383 | 
            +
                                    sid,
         | 
| 384 | 
            +
                                    audio_pad[s : t + self.t_pad2 + self.window],
         | 
| 385 | 
            +
                                    None,
         | 
| 386 | 
            +
                                    None,
         | 
| 387 | 
            +
                                    times,
         | 
| 388 | 
            +
                                    index,
         | 
| 389 | 
            +
                                    big_npy,
         | 
| 390 | 
            +
                                    index_rate,
         | 
| 391 | 
            +
                                    version,
         | 
| 392 | 
            +
                                    protect,
         | 
| 393 | 
            +
                                )[self.t_pad_tgt : -self.t_pad_tgt]
         | 
| 394 | 
            +
                            )
         | 
| 395 | 
            +
                        s = t
         | 
| 396 | 
            +
                    if if_f0 == 1:
         | 
| 397 | 
            +
                        audio_opt.append(
         | 
| 398 | 
            +
                            self.vc(
         | 
| 399 | 
            +
                                model,
         | 
| 400 | 
            +
                                net_g,
         | 
| 401 | 
            +
                                sid,
         | 
| 402 | 
            +
                                audio_pad[t:],
         | 
| 403 | 
            +
                                pitch[:, t // self.window :] if t is not None else pitch,
         | 
| 404 | 
            +
                                pitchf[:, t // self.window :] if t is not None else pitchf,
         | 
| 405 | 
            +
                                times,
         | 
| 406 | 
            +
                                index,
         | 
| 407 | 
            +
                                big_npy,
         | 
| 408 | 
            +
                                index_rate,
         | 
| 409 | 
            +
                                version,
         | 
| 410 | 
            +
                                protect,
         | 
| 411 | 
            +
                            )[self.t_pad_tgt : -self.t_pad_tgt]
         | 
| 412 | 
            +
                        )
         | 
| 413 | 
            +
                    else:
         | 
| 414 | 
            +
                        audio_opt.append(
         | 
| 415 | 
            +
                            self.vc(
         | 
| 416 | 
            +
                                model,
         | 
| 417 | 
            +
                                net_g,
         | 
| 418 | 
            +
                                sid,
         | 
| 419 | 
            +
                                audio_pad[t:],
         | 
| 420 | 
            +
                                None,
         | 
| 421 | 
            +
                                None,
         | 
| 422 | 
            +
                                times,
         | 
| 423 | 
            +
                                index,
         | 
| 424 | 
            +
                                big_npy,
         | 
| 425 | 
            +
                                index_rate,
         | 
| 426 | 
            +
                                version,
         | 
| 427 | 
            +
                                protect,
         | 
| 428 | 
            +
                            )[self.t_pad_tgt : -self.t_pad_tgt]
         | 
| 429 | 
            +
                        )
         | 
| 430 | 
            +
                    audio_opt = np.concatenate(audio_opt)
         | 
| 431 | 
            +
                    if rms_mix_rate != 1:
         | 
| 432 | 
            +
                        audio_opt = change_rms(audio, 16000, audio_opt, tgt_sr, rms_mix_rate)
         | 
| 433 | 
            +
                    if resample_sr >= 16000 and tgt_sr != resample_sr:
         | 
| 434 | 
            +
                        audio_opt = librosa.resample(
         | 
| 435 | 
            +
                            audio_opt, orig_sr=tgt_sr, target_sr=resample_sr
         | 
| 436 | 
            +
                        )
         | 
| 437 | 
            +
                    audio_max = np.abs(audio_opt).max() / 0.99
         | 
| 438 | 
            +
                    max_int16 = 32768
         | 
| 439 | 
            +
                    if audio_max > 1:
         | 
| 440 | 
            +
                        max_int16 /= audio_max
         | 
| 441 | 
            +
                    audio_opt = (audio_opt * max_int16).astype(np.int16)
         | 
| 442 | 
            +
                    del pitch, pitchf, sid
         | 
| 443 | 
            +
                    if torch.cuda.is_available():
         | 
| 444 | 
            +
                        torch.cuda.empty_cache()
         | 
| 445 | 
            +
                    return audio_opt
         | 
    	
        voice_main.py
    ADDED
    
    | @@ -0,0 +1,554 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            import torch
         | 
| 2 | 
            +
            from lib.infer_pack.models import (
         | 
| 3 | 
            +
                SynthesizerTrnMs256NSFsid,
         | 
| 4 | 
            +
                SynthesizerTrnMs256NSFsid_nono,
         | 
| 5 | 
            +
                SynthesizerTrnMs768NSFsid,
         | 
| 6 | 
            +
                SynthesizerTrnMs768NSFsid_nono,
         | 
| 7 | 
            +
            )
         | 
| 8 | 
            +
            from vc_infer_pipeline import VC
         | 
| 9 | 
            +
            import traceback, pdb
         | 
| 10 | 
            +
            from lib.audio import load_audio
         | 
| 11 | 
            +
            import numpy as np
         | 
| 12 | 
            +
            import os
         | 
| 13 | 
            +
            from fairseq import checkpoint_utils
         | 
| 14 | 
            +
            import soundfile as sf
         | 
| 15 | 
            +
            from gtts import gTTS
         | 
| 16 | 
            +
            import edge_tts
         | 
| 17 | 
            +
            import asyncio
         | 
| 18 | 
            +
            import nest_asyncio
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            # model load
         | 
| 21 | 
            +
            def get_vc(sid, to_return_protect0, to_return_protect1):
         | 
| 22 | 
            +
                global n_spk, tgt_sr, net_g, vc, cpt, version
         | 
| 23 | 
            +
                if sid == "" or sid == []:
         | 
| 24 | 
            +
                    global hubert_model
         | 
| 25 | 
            +
                    if hubert_model is not None:  # change model or not
         | 
| 26 | 
            +
                        print("clean_empty_cache")
         | 
| 27 | 
            +
                        del net_g, n_spk, vc, hubert_model, tgt_sr  # ,cpt
         | 
| 28 | 
            +
                        hubert_model = net_g = n_spk = vc = hubert_model = tgt_sr = None
         | 
| 29 | 
            +
                        if torch.cuda.is_available():
         | 
| 30 | 
            +
                            torch.cuda.empty_cache()
         | 
| 31 | 
            +
                        ### if clean
         | 
| 32 | 
            +
                        if_f0 = cpt.get("f0", 1)
         | 
| 33 | 
            +
                        version = cpt.get("version", "v1")
         | 
| 34 | 
            +
                        if version == "v1":
         | 
| 35 | 
            +
                            if if_f0 == 1:
         | 
| 36 | 
            +
                                net_g = SynthesizerTrnMs256NSFsid(
         | 
| 37 | 
            +
                                    *cpt["config"], is_half=config.is_half
         | 
| 38 | 
            +
                                )
         | 
| 39 | 
            +
                            else:
         | 
| 40 | 
            +
                                net_g = SynthesizerTrnMs256NSFsid_nono(*cpt["config"])
         | 
| 41 | 
            +
                        elif version == "v2":
         | 
| 42 | 
            +
                            if if_f0 == 1:
         | 
| 43 | 
            +
                                net_g = SynthesizerTrnMs768NSFsid(
         | 
| 44 | 
            +
                                    *cpt["config"], is_half=config.is_half
         | 
| 45 | 
            +
                                )
         | 
| 46 | 
            +
                            else:
         | 
| 47 | 
            +
                                net_g = SynthesizerTrnMs768NSFsid_nono(*cpt["config"])
         | 
| 48 | 
            +
                        del net_g, cpt
         | 
| 49 | 
            +
                        if torch.cuda.is_available():
         | 
| 50 | 
            +
                            torch.cuda.empty_cache()
         | 
| 51 | 
            +
                    return {"visible": False, "__type__": "update"}
         | 
| 52 | 
            +
                person = "%s/%s" % (weight_root, sid)
         | 
| 53 | 
            +
                print("loading %s" % person)
         | 
| 54 | 
            +
                cpt = torch.load(person, map_location="cpu")
         | 
| 55 | 
            +
                tgt_sr = cpt["config"][-1]
         | 
| 56 | 
            +
                cpt["config"][-3] = cpt["weight"]["emb_g.weight"].shape[0]  # n_spk
         | 
| 57 | 
            +
                if_f0 = cpt.get("f0", 1)
         | 
| 58 | 
            +
                if if_f0 == 0:
         | 
| 59 | 
            +
                    to_return_protect0 = to_return_protect1 = {
         | 
| 60 | 
            +
                        "visible": False,
         | 
| 61 | 
            +
                        "value": 0.5,
         | 
| 62 | 
            +
                        "__type__": "update",
         | 
| 63 | 
            +
                    }
         | 
| 64 | 
            +
                else:
         | 
| 65 | 
            +
                    to_return_protect0 = {
         | 
| 66 | 
            +
                        "visible": True,
         | 
| 67 | 
            +
                        "value": to_return_protect0,
         | 
| 68 | 
            +
                        "__type__": "update",
         | 
| 69 | 
            +
                    }
         | 
| 70 | 
            +
                    to_return_protect1 = {
         | 
| 71 | 
            +
                        "visible": True,
         | 
| 72 | 
            +
                        "value": to_return_protect1,
         | 
| 73 | 
            +
                        "__type__": "update",
         | 
| 74 | 
            +
                    }
         | 
| 75 | 
            +
                version = cpt.get("version", "v1")
         | 
| 76 | 
            +
                if version == "v1":
         | 
| 77 | 
            +
                    if if_f0 == 1:
         | 
| 78 | 
            +
                        net_g = SynthesizerTrnMs256NSFsid(*cpt["config"], is_half=config.is_half)
         | 
| 79 | 
            +
                    else:
         | 
| 80 | 
            +
                        net_g = SynthesizerTrnMs256NSFsid_nono(*cpt["config"])
         | 
| 81 | 
            +
                elif version == "v2":
         | 
| 82 | 
            +
                    if if_f0 == 1:
         | 
| 83 | 
            +
                        net_g = SynthesizerTrnMs768NSFsid(*cpt["config"], is_half=config.is_half)
         | 
| 84 | 
            +
                    else:
         | 
| 85 | 
            +
                        net_g = SynthesizerTrnMs768NSFsid_nono(*cpt["config"])
         | 
| 86 | 
            +
                del net_g.enc_q
         | 
| 87 | 
            +
                print(net_g.load_state_dict(cpt["weight"], strict=False))
         | 
| 88 | 
            +
                net_g.eval().to(config.device)
         | 
| 89 | 
            +
                if config.is_half:
         | 
| 90 | 
            +
                    net_g = net_g.half()
         | 
| 91 | 
            +
                else:
         | 
| 92 | 
            +
                    net_g = net_g.float()
         | 
| 93 | 
            +
                vc = VC(tgt_sr, config)
         | 
| 94 | 
            +
                n_spk = cpt["config"][-3]
         | 
| 95 | 
            +
                return (
         | 
| 96 | 
            +
                    {"visible": True, "maximum": n_spk, "__type__": "update"},
         | 
| 97 | 
            +
                    to_return_protect0,
         | 
| 98 | 
            +
                    to_return_protect1,
         | 
| 99 | 
            +
                )
         | 
| 100 | 
            +
             | 
| 101 | 
            +
             | 
| 102 | 
            +
             | 
| 103 | 
            +
            # inference
         | 
| 104 | 
            +
            def vc_single(
         | 
| 105 | 
            +
                sid,
         | 
| 106 | 
            +
                input_audio_path,
         | 
| 107 | 
            +
                f0_up_key,
         | 
| 108 | 
            +
                f0_file,
         | 
| 109 | 
            +
                f0_method,
         | 
| 110 | 
            +
                file_index,
         | 
| 111 | 
            +
                file_index2,
         | 
| 112 | 
            +
                # file_big_npy,
         | 
| 113 | 
            +
                index_rate,
         | 
| 114 | 
            +
                filter_radius,
         | 
| 115 | 
            +
                resample_sr,
         | 
| 116 | 
            +
                rms_mix_rate,
         | 
| 117 | 
            +
                protect,
         | 
| 118 | 
            +
            ):  
         | 
| 119 | 
            +
                global tgt_sr, net_g, vc, hubert_model, version, cpt
         | 
| 120 | 
            +
                if input_audio_path is None:
         | 
| 121 | 
            +
                    return "You need to upload an audio", None
         | 
| 122 | 
            +
                f0_up_key = int(f0_up_key)
         | 
| 123 | 
            +
                try:
         | 
| 124 | 
            +
                    audio = load_audio(input_audio_path, 16000)
         | 
| 125 | 
            +
                    audio_max = np.abs(audio).max() / 0.95
         | 
| 126 | 
            +
                    if audio_max > 1:
         | 
| 127 | 
            +
                        audio /= audio_max
         | 
| 128 | 
            +
                    times = [0, 0, 0]
         | 
| 129 | 
            +
                    if not hubert_model:
         | 
| 130 | 
            +
                        load_hubert()
         | 
| 131 | 
            +
                    if_f0 = cpt.get("f0", 1)
         | 
| 132 | 
            +
                    file_index = (
         | 
| 133 | 
            +
                        (
         | 
| 134 | 
            +
                            file_index.strip(" ")
         | 
| 135 | 
            +
                            .strip('"')
         | 
| 136 | 
            +
                            .strip("\n")
         | 
| 137 | 
            +
                            .strip('"')
         | 
| 138 | 
            +
                            .strip(" ")
         | 
| 139 | 
            +
                            .replace("trained", "added")
         | 
| 140 | 
            +
                        )
         | 
| 141 | 
            +
                        if file_index != ""
         | 
| 142 | 
            +
                        else file_index2
         | 
| 143 | 
            +
                    )  # reemplace for 2
         | 
| 144 | 
            +
                    # file_big_npy = (
         | 
| 145 | 
            +
                    #     file_big_npy.strip(" ").strip('"').strip("\n").strip('"').strip(" ")
         | 
| 146 | 
            +
                    # )
         | 
| 147 | 
            +
                    audio_opt = vc.pipeline(
         | 
| 148 | 
            +
                        hubert_model,
         | 
| 149 | 
            +
                        net_g,
         | 
| 150 | 
            +
                        sid,
         | 
| 151 | 
            +
                        audio,
         | 
| 152 | 
            +
                        input_audio_path,
         | 
| 153 | 
            +
                        times,
         | 
| 154 | 
            +
                        f0_up_key,
         | 
| 155 | 
            +
                        f0_method,
         | 
| 156 | 
            +
                        file_index,
         | 
| 157 | 
            +
                        # file_big_npy,
         | 
| 158 | 
            +
                        index_rate,
         | 
| 159 | 
            +
                        if_f0,
         | 
| 160 | 
            +
                        filter_radius,
         | 
| 161 | 
            +
                        tgt_sr,
         | 
| 162 | 
            +
                        resample_sr,
         | 
| 163 | 
            +
                        rms_mix_rate,
         | 
| 164 | 
            +
                        version,
         | 
| 165 | 
            +
                        protect,
         | 
| 166 | 
            +
                        f0_file=f0_file,
         | 
| 167 | 
            +
                    )
         | 
| 168 | 
            +
                    if tgt_sr != resample_sr >= 16000:
         | 
| 169 | 
            +
                        tgt_sr = resample_sr
         | 
| 170 | 
            +
                    index_info = (
         | 
| 171 | 
            +
                        "Using index:%s." % file_index
         | 
| 172 | 
            +
                        if os.path.exists(file_index)
         | 
| 173 | 
            +
                        else "Index not used."
         | 
| 174 | 
            +
                    )
         | 
| 175 | 
            +
                    return "Success.\n %s\nTime:\n npy:%ss, f0:%ss, infer:%ss" % (
         | 
| 176 | 
            +
                        index_info,
         | 
| 177 | 
            +
                        times[0],
         | 
| 178 | 
            +
                        times[1],
         | 
| 179 | 
            +
                        times[2],
         | 
| 180 | 
            +
                    ), (tgt_sr, audio_opt)
         | 
| 181 | 
            +
                except:
         | 
| 182 | 
            +
                    info = traceback.format_exc()
         | 
| 183 | 
            +
                    print(info)
         | 
| 184 | 
            +
                    return info, (None, None)
         | 
| 185 | 
            +
             | 
| 186 | 
            +
             | 
| 187 | 
            +
             | 
| 188 | 
            +
            # hubert model
         | 
| 189 | 
            +
            def load_hubert():
         | 
| 190 | 
            +
                global hubert_model
         | 
| 191 | 
            +
                models, _, _ = checkpoint_utils.load_model_ensemble_and_task(
         | 
| 192 | 
            +
                    ["hubert_base.pt"],
         | 
| 193 | 
            +
                    suffix="",
         | 
| 194 | 
            +
                )
         | 
| 195 | 
            +
                hubert_model = models[0]
         | 
| 196 | 
            +
                hubert_model = hubert_model.to(config.device)
         | 
| 197 | 
            +
                if config.is_half:
         | 
| 198 | 
            +
                    hubert_model = hubert_model.half()
         | 
| 199 | 
            +
                else:
         | 
| 200 | 
            +
                    hubert_model = hubert_model.float()
         | 
| 201 | 
            +
                hubert_model.eval()
         | 
| 202 | 
            +
             | 
| 203 | 
            +
            # config cpu
         | 
| 204 | 
            +
            def use_fp32_config():
         | 
| 205 | 
            +
                for config_file in [
         | 
| 206 | 
            +
                    "32k.json",
         | 
| 207 | 
            +
                    "40k.json",
         | 
| 208 | 
            +
                    "48k.json",
         | 
| 209 | 
            +
                    "48k_v2.json",
         | 
| 210 | 
            +
                    "32k_v2.json",
         | 
| 211 | 
            +
                ]:
         | 
| 212 | 
            +
                    with open(f"configs/{config_file}", "r") as f:
         | 
| 213 | 
            +
                        strr = f.read().replace("true", "false")
         | 
| 214 | 
            +
                    with open(f"configs/{config_file}", "w") as f:
         | 
| 215 | 
            +
                        f.write(strr)
         | 
| 216 | 
            +
             | 
| 217 | 
            +
            # config device and torch type
         | 
| 218 | 
            +
            class Config:
         | 
| 219 | 
            +
                def __init__(self, device, is_half):
         | 
| 220 | 
            +
                    self.device = device
         | 
| 221 | 
            +
                    self.is_half = is_half
         | 
| 222 | 
            +
                    self.n_cpu = 2 # set cpu cores ####################
         | 
| 223 | 
            +
                    self.gpu_name = None
         | 
| 224 | 
            +
                    self.gpu_mem = None
         | 
| 225 | 
            +
                    self.x_pad, self.x_query, self.x_center, self.x_max = self.device_config()
         | 
| 226 | 
            +
             | 
| 227 | 
            +
                def device_config(self) -> tuple:
         | 
| 228 | 
            +
                    if torch.cuda.is_available():
         | 
| 229 | 
            +
                        i_device = int(self.device.split(":")[-1])
         | 
| 230 | 
            +
                        self.gpu_name = torch.cuda.get_device_name(i_device)
         | 
| 231 | 
            +
                        if (
         | 
| 232 | 
            +
                            ("16" in self.gpu_name and "V100" not in self.gpu_name.upper())
         | 
| 233 | 
            +
                            or "P40" in self.gpu_name.upper()
         | 
| 234 | 
            +
                            or "1060" in self.gpu_name
         | 
| 235 | 
            +
                            or "1070" in self.gpu_name
         | 
| 236 | 
            +
                            or "1080" in self.gpu_name
         | 
| 237 | 
            +
                        ):
         | 
| 238 | 
            +
                            print("16 series / 10 series graphics cards and P40 force single precision")
         | 
| 239 | 
            +
                            self.is_half = False
         | 
| 240 | 
            +
                            for config_file in ["32k.json", "40k.json", "48k.json"]:
         | 
| 241 | 
            +
                                with open(f"configs/{config_file}", "r") as f:
         | 
| 242 | 
            +
                                    strr = f.read().replace("true", "false")
         | 
| 243 | 
            +
                                with open(f"configs/{config_file}", "w") as f:
         | 
| 244 | 
            +
                                    f.write(strr)
         | 
| 245 | 
            +
                            with open("trainset_preprocess_pipeline_print.py", "r") as f:
         | 
| 246 | 
            +
                                strr = f.read().replace("3.7", "3.0")
         | 
| 247 | 
            +
                            with open("trainset_preprocess_pipeline_print.py", "w") as f:
         | 
| 248 | 
            +
                                f.write(strr)
         | 
| 249 | 
            +
                        else:
         | 
| 250 | 
            +
                            self.gpu_name = None
         | 
| 251 | 
            +
                        self.gpu_mem = int(
         | 
| 252 | 
            +
                            torch.cuda.get_device_properties(i_device).total_memory
         | 
| 253 | 
            +
                            / 1024
         | 
| 254 | 
            +
                            / 1024
         | 
| 255 | 
            +
                            / 1024
         | 
| 256 | 
            +
                            + 0.4
         | 
| 257 | 
            +
                        )
         | 
| 258 | 
            +
                        if self.gpu_mem <= 4:
         | 
| 259 | 
            +
                            with open("trainset_preprocess_pipeline_print.py", "r") as f:
         | 
| 260 | 
            +
                                strr = f.read().replace("3.7", "3.0")
         | 
| 261 | 
            +
                            with open("trainset_preprocess_pipeline_print.py", "w") as f:
         | 
| 262 | 
            +
                                f.write(strr)
         | 
| 263 | 
            +
                    elif torch.backends.mps.is_available():
         | 
| 264 | 
            +
                        print("Supported N-card not found, using MPS for inference")
         | 
| 265 | 
            +
                        self.device = "mps"
         | 
| 266 | 
            +
                    else:
         | 
| 267 | 
            +
                        print("No supported N-card found, using CPU for inference")
         | 
| 268 | 
            +
                        self.device = "cpu"
         | 
| 269 | 
            +
                        self.is_half = False
         | 
| 270 | 
            +
                        use_fp32_config()
         | 
| 271 | 
            +
             | 
| 272 | 
            +
                    if self.n_cpu == 0:
         | 
| 273 | 
            +
                        self.n_cpu = cpu_count()
         | 
| 274 | 
            +
             | 
| 275 | 
            +
                    if self.is_half:
         | 
| 276 | 
            +
                        # 6GB VRAM configuration
         | 
| 277 | 
            +
                        x_pad = 3
         | 
| 278 | 
            +
                        x_query = 10
         | 
| 279 | 
            +
                        x_center = 60
         | 
| 280 | 
            +
                        x_max = 65
         | 
| 281 | 
            +
                    else:
         | 
| 282 | 
            +
                        # 5GB VRAM configuration
         | 
| 283 | 
            +
                        x_pad = 1
         | 
| 284 | 
            +
                        x_query = 6
         | 
| 285 | 
            +
                        x_center = 38
         | 
| 286 | 
            +
                        x_max = 41
         | 
| 287 | 
            +
             | 
| 288 | 
            +
                    if self.gpu_mem != None and self.gpu_mem <= 4:
         | 
| 289 | 
            +
                        x_pad = 1
         | 
| 290 | 
            +
                        x_query = 5
         | 
| 291 | 
            +
                        x_center = 30
         | 
| 292 | 
            +
                        x_max = 32
         | 
| 293 | 
            +
             | 
| 294 | 
            +
             | 
| 295 | 
            +
             | 
| 296 | 
            +
             | 
| 297 | 
            +
                    print(self.device, self.is_half)
         | 
| 298 | 
            +
             | 
| 299 | 
            +
                    return x_pad, x_query, x_center, x_max
         | 
| 300 | 
            +
             | 
| 301 | 
            +
            # call inference
         | 
| 302 | 
            +
            class ClassVoices:
         | 
| 303 | 
            +
                def __init__(self):
         | 
| 304 | 
            +
                    self.file_index = "" # root
         | 
| 305 | 
            +
             | 
| 306 | 
            +
                def apply_conf(self, f0method,
         | 
| 307 | 
            +
                               model_voice_path00, transpose00, file_index2_00,
         | 
| 308 | 
            +
                               model_voice_path01, transpose01, file_index2_01,
         | 
| 309 | 
            +
                               model_voice_path02, transpose02, file_index2_02,
         | 
| 310 | 
            +
                               model_voice_path03, transpose03, file_index2_03,
         | 
| 311 | 
            +
                               model_voice_path04, transpose04, file_index2_04,
         | 
| 312 | 
            +
                               model_voice_path05, transpose05, file_index2_05,
         | 
| 313 | 
            +
                               model_voice_path99, transpose99, file_index2_99):
         | 
| 314 | 
            +
             | 
| 315 | 
            +
                    #self.filename = filename
         | 
| 316 | 
            +
                    self.f0method = f0method # pm
         | 
| 317 | 
            +
                    
         | 
| 318 | 
            +
                    self.model_voice_path00 = model_voice_path00
         | 
| 319 | 
            +
                    self.transpose00 = transpose00
         | 
| 320 | 
            +
                    self.file_index200 = file_index2_00
         | 
| 321 | 
            +
             | 
| 322 | 
            +
                    self.model_voice_path01 = model_voice_path01
         | 
| 323 | 
            +
                    self.transpose01 = transpose01
         | 
| 324 | 
            +
                    self.file_index201 = file_index2_01
         | 
| 325 | 
            +
             | 
| 326 | 
            +
                    self.model_voice_path02 = model_voice_path02
         | 
| 327 | 
            +
                    self.transpose02 = transpose02
         | 
| 328 | 
            +
                    self.file_index202 = file_index2_02
         | 
| 329 | 
            +
             | 
| 330 | 
            +
                    self.model_voice_path03 = model_voice_path03
         | 
| 331 | 
            +
                    self.transpose03 = transpose03
         | 
| 332 | 
            +
                    self.file_index203 = file_index2_03
         | 
| 333 | 
            +
             | 
| 334 | 
            +
                    self.model_voice_path04 = model_voice_path04
         | 
| 335 | 
            +
                    self.transpose04 = transpose04
         | 
| 336 | 
            +
                    self.file_index204 = file_index2_04
         | 
| 337 | 
            +
             | 
| 338 | 
            +
                    self.model_voice_path05 = model_voice_path05
         | 
| 339 | 
            +
                    self.transpose05 = transpose05
         | 
| 340 | 
            +
                    self.file_index205 = file_index2_05
         | 
| 341 | 
            +
             | 
| 342 | 
            +
                    self.model_voice_path99 = model_voice_path99
         | 
| 343 | 
            +
                    self.transpose99 = transpose99
         | 
| 344 | 
            +
                    self.file_index299 = file_index2_99
         | 
| 345 | 
            +
                    return "CONFIGURATION APPLIED"
         | 
| 346 | 
            +
             | 
| 347 | 
            +
                def custom_voice(self,
         | 
| 348 | 
            +
                    _values, # filter indices
         | 
| 349 | 
            +
                    audio_files, # all audio files
         | 
| 350 | 
            +
                    model_voice_path='',
         | 
| 351 | 
            +
                    transpose=0,
         | 
| 352 | 
            +
                    f0method='pm',
         | 
| 353 | 
            +
                    file_index='',
         | 
| 354 | 
            +
                    file_index2='',
         | 
| 355 | 
            +
                    ):
         | 
| 356 | 
            +
             | 
| 357 | 
            +
                    #hubert_model = None
         | 
| 358 | 
            +
             | 
| 359 | 
            +
                    get_vc(
         | 
| 360 | 
            +
                        sid=model_voice_path,  # model path
         | 
| 361 | 
            +
                        to_return_protect0=0.33,
         | 
| 362 | 
            +
                        to_return_protect1=0.33
         | 
| 363 | 
            +
                    )
         | 
| 364 | 
            +
             | 
| 365 | 
            +
                    for _value_item in _values:
         | 
| 366 | 
            +
                        filename = "audio2/"+audio_files[_value_item] if _value_item != "test" else audio_files[0]
         | 
| 367 | 
            +
                        #filename = "audio2/"+audio_files[_value_item]
         | 
| 368 | 
            +
                        try:
         | 
| 369 | 
            +
                            print(audio_files[_value_item], model_voice_path)
         | 
| 370 | 
            +
                        except:
         | 
| 371 | 
            +
                            pass
         | 
| 372 | 
            +
             | 
| 373 | 
            +
                        info_, (sample_, audio_output_) = vc_single(
         | 
| 374 | 
            +
                            sid=0,
         | 
| 375 | 
            +
                            input_audio_path=filename, #f"audio2/{filename}",
         | 
| 376 | 
            +
                            f0_up_key=transpose, # transpose for m to f and reverse 0 12
         | 
| 377 | 
            +
                            f0_file=None,
         | 
| 378 | 
            +
                            f0_method= f0method,
         | 
| 379 | 
            +
                            file_index= file_index, # dir pwd?
         | 
| 380 | 
            +
                            file_index2= file_index2,
         | 
| 381 | 
            +
                            # file_big_npy1,
         | 
| 382 | 
            +
                            index_rate= float(0.66),
         | 
| 383 | 
            +
                            filter_radius= int(3),
         | 
| 384 | 
            +
                            resample_sr= int(0),
         | 
| 385 | 
            +
                            rms_mix_rate= float(0.25),
         | 
| 386 | 
            +
                            protect= float(0.33),
         | 
| 387 | 
            +
                        )
         | 
| 388 | 
            +
             | 
| 389 | 
            +
                        sf.write(
         | 
| 390 | 
            +
                            file= filename, #f"audio2/{filename}",
         | 
| 391 | 
            +
                            samplerate=sample_,
         | 
| 392 | 
            +
                            data=audio_output_
         | 
| 393 | 
            +
                        )
         | 
| 394 | 
            +
             | 
| 395 | 
            +
                    # detele the model
         | 
| 396 | 
            +
             | 
| 397 | 
            +
                def make_test(self, 
         | 
| 398 | 
            +
                    tts_text, 
         | 
| 399 | 
            +
                    tts_voice, 
         | 
| 400 | 
            +
                    model_path,
         | 
| 401 | 
            +
                    index_path,
         | 
| 402 | 
            +
                    transpose,
         | 
| 403 | 
            +
                    f0_method,
         | 
| 404 | 
            +
                    ):
         | 
| 405 | 
            +
                    os.system("rm -rf test")
         | 
| 406 | 
            +
                    filename = "test/test.wav"
         | 
| 407 | 
            +
             | 
| 408 | 
            +
                    if "SET_LIMIT" == os.getenv("DEMO"):
         | 
| 409 | 
            +
                      if len(tts_text) > 60:
         | 
| 410 | 
            +
                        tts_text = tts_text[:60]
         | 
| 411 | 
            +
                        print("DEMO; limit to 60 characters")
         | 
| 412 | 
            +
             | 
| 413 | 
            +
                    language = tts_voice[:2]
         | 
| 414 | 
            +
                    try:
         | 
| 415 | 
            +
                      os.system("mkdir test")
         | 
| 416 | 
            +
                      #nest_asyncio.apply() # gradio;not
         | 
| 417 | 
            +
                      asyncio.run(edge_tts.Communicate(tts_text, "-".join(tts_voice.split('-')[:-1])).save(filename))
         | 
| 418 | 
            +
                    except:
         | 
| 419 | 
            +
                      try:
         | 
| 420 | 
            +
                          tts = gTTS(tts_text, lang=language)
         | 
| 421 | 
            +
                          tts.save(filename)
         | 
| 422 | 
            +
                          tts.save
         | 
| 423 | 
            +
                          print(f'No audio was received. Please change the tts voice for {tts_voice}. USING gTTS.')
         | 
| 424 | 
            +
                      except:
         | 
| 425 | 
            +
                        tts = gTTS('a', lang=language)
         | 
| 426 | 
            +
                        tts.save(filename)
         | 
| 427 | 
            +
                        print('Error: Audio will be replaced.')
         | 
| 428 | 
            +
             | 
| 429 | 
            +
                    os.system("cp test/test.wav test/real_test.wav")
         | 
| 430 | 
            +
             | 
| 431 | 
            +
                    self([],[]) # start modules
         | 
| 432 | 
            +
             | 
| 433 | 
            +
                    self.custom_voice(
         | 
| 434 | 
            +
                        ["test"], # filter indices
         | 
| 435 | 
            +
                        ["test/test.wav"], # all audio files
         | 
| 436 | 
            +
                        model_voice_path=model_path,
         | 
| 437 | 
            +
                        transpose=transpose,
         | 
| 438 | 
            +
                        f0method=f0_method,
         | 
| 439 | 
            +
                        file_index='',
         | 
| 440 | 
            +
                        file_index2=index_path,
         | 
| 441 | 
            +
                    )
         | 
| 442 | 
            +
                    return "test/test.wav", "test/real_test.wav"
         | 
| 443 | 
            +
             | 
| 444 | 
            +
                def __call__(self, speakers_list, audio_files):
         | 
| 445 | 
            +
             | 
| 446 | 
            +
                    speakers_indices = {}
         | 
| 447 | 
            +
             | 
| 448 | 
            +
                    for index, speak_ in enumerate(speakers_list):
         | 
| 449 | 
            +
                        if speak_ in speakers_indices:
         | 
| 450 | 
            +
                            speakers_indices[speak_].append(index)
         | 
| 451 | 
            +
                        else:
         | 
| 452 | 
            +
                            speakers_indices[speak_] = [index]
         | 
| 453 | 
            +
             | 
| 454 | 
            +
                    
         | 
| 455 | 
            +
                    # find models and index
         | 
| 456 | 
            +
                    global weight_root, index_root, config, hubert_model
         | 
| 457 | 
            +
                    weight_root = "weights"
         | 
| 458 | 
            +
                    names = []
         | 
| 459 | 
            +
                    for name in os.listdir(weight_root):
         | 
| 460 | 
            +
                        if name.endswith(".pth"):
         | 
| 461 | 
            +
                            names.append(name)
         | 
| 462 | 
            +
             | 
| 463 | 
            +
                    index_root = "logs"
         | 
| 464 | 
            +
                    index_paths = []
         | 
| 465 | 
            +
                    for name in os.listdir(index_root):
         | 
| 466 | 
            +
                        if name.endswith(".index"):
         | 
| 467 | 
            +
                            index_paths.append(name)
         | 
| 468 | 
            +
             | 
| 469 | 
            +
                    print(names, index_paths)
         | 
| 470 | 
            +
                    # config machine
         | 
| 471 | 
            +
                    hubert_model = None
         | 
| 472 | 
            +
                    config = Config('cuda:0', is_half=True) # config = Config('cpu', is_half=False) # cpu
         | 
| 473 | 
            +
             | 
| 474 | 
            +
                    # filter by speaker
         | 
| 475 | 
            +
                    for _speak, _values in speakers_indices.items():
         | 
| 476 | 
            +
                        #print(_speak, _values)
         | 
| 477 | 
            +
                        #for _value_item in _values:
         | 
| 478 | 
            +
                        #  self.filename = "audio2/"+audio_files[_value_item]
         | 
| 479 | 
            +
                        ###print(audio_files[_value_item])
         | 
| 480 | 
            +
             | 
| 481 | 
            +
                        #vc(_speak, _values, audio_files)
         | 
| 482 | 
            +
             | 
| 483 | 
            +
                        if _speak == "SPEAKER_00":
         | 
| 484 | 
            +
                          self.custom_voice(
         | 
| 485 | 
            +
                                _values, # filteredd
         | 
| 486 | 
            +
                                audio_files,
         | 
| 487 | 
            +
                                model_voice_path=self.model_voice_path00,
         | 
| 488 | 
            +
                                file_index2=self.file_index200,
         | 
| 489 | 
            +
                                transpose=self.transpose00,
         | 
| 490 | 
            +
                                f0method=self.f0method,
         | 
| 491 | 
            +
                                file_index=self.file_index,
         | 
| 492 | 
            +
                                )
         | 
| 493 | 
            +
                        elif _speak == "SPEAKER_01":
         | 
| 494 | 
            +
                            self.custom_voice(
         | 
| 495 | 
            +
                                _values,
         | 
| 496 | 
            +
                                audio_files,
         | 
| 497 | 
            +
                                model_voice_path=self.model_voice_path01,
         | 
| 498 | 
            +
                                file_index2=self.file_index201,
         | 
| 499 | 
            +
                                transpose=self.transpose01,
         | 
| 500 | 
            +
                                f0method=self.f0method,
         | 
| 501 | 
            +
                                file_index=self.file_index,
         | 
| 502 | 
            +
                            )
         | 
| 503 | 
            +
                        elif _speak == "SPEAKER_02":
         | 
| 504 | 
            +
                            self.custom_voice(
         | 
| 505 | 
            +
                                _values,
         | 
| 506 | 
            +
                                audio_files,
         | 
| 507 | 
            +
                                model_voice_path=self.model_voice_path02,
         | 
| 508 | 
            +
                                file_index2=self.file_index202,
         | 
| 509 | 
            +
                                transpose=self.transpose02,
         | 
| 510 | 
            +
                                f0method=self.f0method,
         | 
| 511 | 
            +
                                file_index=self.file_index,
         | 
| 512 | 
            +
                            )
         | 
| 513 | 
            +
                        elif _speak == "SPEAKER_03":
         | 
| 514 | 
            +
                            self.custom_voice(
         | 
| 515 | 
            +
                                _values,
         | 
| 516 | 
            +
                                audio_files,
         | 
| 517 | 
            +
                                model_voice_path=self.model_voice_path03,
         | 
| 518 | 
            +
                                file_index2=self.file_index203,
         | 
| 519 | 
            +
                                transpose=self.transpose03,
         | 
| 520 | 
            +
                                f0method=self.f0method,
         | 
| 521 | 
            +
                                file_index=self.file_index,
         | 
| 522 | 
            +
                            )
         | 
| 523 | 
            +
                        elif _speak == "SPEAKER_04":
         | 
| 524 | 
            +
                            self.custom_voice(
         | 
| 525 | 
            +
                                _values,
         | 
| 526 | 
            +
                                audio_files,
         | 
| 527 | 
            +
                                model_voice_path=self.model_voice_path04,
         | 
| 528 | 
            +
                                file_index2=self.file_index204,
         | 
| 529 | 
            +
                                transpose=self.transpose04,
         | 
| 530 | 
            +
                                f0method=self.f0method,
         | 
| 531 | 
            +
                                file_index=self.file_index,
         | 
| 532 | 
            +
                            )
         | 
| 533 | 
            +
                        elif _speak == "SPEAKER_05":
         | 
| 534 | 
            +
                            self.custom_voice(
         | 
| 535 | 
            +
                                _values,
         | 
| 536 | 
            +
                                audio_files,
         | 
| 537 | 
            +
                                model_voice_path=self.model_voice_path05,
         | 
| 538 | 
            +
                                file_index2=self.file_index205,
         | 
| 539 | 
            +
                                transpose=self.transpose05,
         | 
| 540 | 
            +
                                f0method=self.f0method,
         | 
| 541 | 
            +
                                file_index=self.file_index,
         | 
| 542 | 
            +
                            )
         | 
| 543 | 
            +
                        elif _speak == "SPEAKER_99":
         | 
| 544 | 
            +
                            self.custom_voice(
         | 
| 545 | 
            +
                                _values,
         | 
| 546 | 
            +
                                audio_files,
         | 
| 547 | 
            +
                                model_voice_path=self.model_voice_path99,
         | 
| 548 | 
            +
                                file_index2=self.file_index299,
         | 
| 549 | 
            +
                                transpose=self.transpose99,
         | 
| 550 | 
            +
                                f0method=self.f0method,
         | 
| 551 | 
            +
                                file_index=self.file_index,
         | 
| 552 | 
            +
                            )
         | 
| 553 | 
            +
                        else:
         | 
| 554 | 
            +
                            pass
         | 
 
			
