Spaces:
				
			
			
	
			
			
		Running
		
			on 
			
			Zero
	
	
	
			
			
	
	
	
	
		
		
		Running
		
			on 
			
			Zero
	Update app.py
Browse files
    	
        app.py
    CHANGED
    
    | @@ -1,37 +1,129 @@ | |
| 1 | 
            -
            import torch | 
| 2 | 
            -
            import  | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 5 | 
            -
             | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 16 |  | 
| 17 | 
             
            @spaces.GPU
         | 
| 18 | 
            -
            def  | 
| 19 | 
            -
                 | 
| 20 | 
            -
                 | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
                     | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 27 | 
            -
                     | 
| 28 | 
            -
             | 
| 29 | 
            -
                 | 
| 30 | 
            -
                 | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 33 | 
            -
                 | 
| 34 | 
            -
             | 
| 35 | 
            -
                out = gr.Image(label="Generated image", interactive=False)
         | 
| 36 | 
            -
                btn.click(generate,inputs=prompt,outputs=out)
         | 
| 37 | 
            -
            demo.queue().launch()
         | 
|  | |
| 1 | 
            +
            import torch as T
         | 
| 2 | 
            +
            import torch.nn as nn
         | 
| 3 | 
            +
            import torch.nn.functional as F
         | 
| 4 | 
            +
            import torchaudio
         | 
| 5 | 
            +
            from utils import load_ckpt, print_colored
         | 
| 6 | 
            +
            from tokenizer import make_tokenizer
         | 
| 7 | 
            +
            from model import get_hertz_dev_config
         | 
| 8 | 
            +
            import matplotlib.pyplot as plt
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            device = 'cuda' if T.cuda.is_available() else 'cpu'
         | 
| 11 | 
            +
            T.cuda.set_device(0)
         | 
| 12 | 
            +
            print_colored(f"Using device: {device}", "grey")
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            audio_tokenizer = make_tokenizer(device)
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            TWO_SPEAKER = False
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            model_config = get_hertz_dev_config(is_split=TWO_SPEAKER)
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            generator = model_config()
         | 
| 21 | 
            +
            generator = generator.eval().to(T.bfloat16).to(device)
         | 
| 22 | 
            +
             | 
| 23 | 
            +
             | 
| 24 | 
            +
             | 
| 25 | 
            +
            ##############
         | 
| 26 | 
            +
            # Load audio
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            def load_and_preprocess_audio(audio_path):
         | 
| 29 | 
            +
                gr.Info("Loading and preprocessing audio...")
         | 
| 30 | 
            +
                # Load audio file
         | 
| 31 | 
            +
                audio_tensor, sr = torchaudio.load(audio_path)
         | 
| 32 | 
            +
                gr.Info(f"Loaded audio shape: {audio_tensor.shape}")
         | 
| 33 | 
            +
                
         | 
| 34 | 
            +
                if TWO_SPEAKER:
         | 
| 35 | 
            +
                    if audio_tensor.shape[0] == 1:
         | 
| 36 | 
            +
                        gr.Info("Converting mono to stereo...")
         | 
| 37 | 
            +
                        audio_tensor = audio_tensor.repeat(2, 1)
         | 
| 38 | 
            +
                        gr.Info(f"Stereo audio shape: {audio_tensor.shape}")
         | 
| 39 | 
            +
                else:
         | 
| 40 | 
            +
                    if audio_tensor.shape[0] == 2:
         | 
| 41 | 
            +
                        gr.Info("Converting stereo to mono...")
         | 
| 42 | 
            +
                        audio_tensor = audio_tensor.mean(dim=0).unsqueeze(0)
         | 
| 43 | 
            +
                        gr.Info(f"Mono audio shape: {audio_tensor.shape}")
         | 
| 44 | 
            +
                    
         | 
| 45 | 
            +
                # Resample to 16kHz if needed
         | 
| 46 | 
            +
                if sr != 16000:
         | 
| 47 | 
            +
                    gr.Info(f"Resampling from {sr}Hz to 16000Hz...")
         | 
| 48 | 
            +
                    resampler = torchaudio.transforms.Resample(orig_freq=sr, new_freq=16000)
         | 
| 49 | 
            +
                    audio_tensor = resampler(audio_tensor)
         | 
| 50 | 
            +
                    
         | 
| 51 | 
            +
                # Clip to 5 minutes if needed
         | 
| 52 | 
            +
                max_samples = 16000 * 60 * 5
         | 
| 53 | 
            +
                if audio_tensor.shape[1] > max_samples:
         | 
| 54 | 
            +
                    # gr.Info("Clipping audio to 5 minutes...")
         | 
| 55 | 
            +
                    raise gr.Erorr("Maximum prompt is 5 minutes")
         | 
| 56 | 
            +
                    # audio_tensor = audio_tensor[:, :max_samples]
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                duration_seconds = audio_tensor.shape[1] / sample_rate
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                gr.Info("Audio preprocessing complete!")
         | 
| 61 | 
            +
                return audio_tensor.unsqueeze(0), duration_seconds
         | 
| 62 | 
            +
             | 
| 63 | 
            +
            ##############
         | 
| 64 | 
            +
            # Return audio to gradio
         | 
| 65 | 
            +
             | 
| 66 | 
            +
            def display_audio(audio_tensor):
         | 
| 67 | 
            +
                audio_tensor = audio_tensor.cpu().squeeze()
         | 
| 68 | 
            +
                if audio_tensor.ndim == 1:
         | 
| 69 | 
            +
                    audio_tensor = audio_tensor.unsqueeze(0)
         | 
| 70 | 
            +
                audio_tensor = audio_tensor.float()
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                # Make a waveform plot
         | 
| 73 | 
            +
                # plt.figure(figsize=(4, 1))
         | 
| 74 | 
            +
                # plt.plot(audio_tensor.numpy()[0], linewidth=0.5)
         | 
| 75 | 
            +
                # plt.axis('off')
         | 
| 76 | 
            +
                # plt.show()
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                # Make an audio player
         | 
| 79 | 
            +
                return (16000, audio_tensor.numpy())
         | 
| 80 | 
            +
             | 
| 81 | 
            +
            def get_completion(encoded_prompt_audio, prompt_len):
         | 
| 82 | 
            +
                prompt_len_seconds = prompt_len / 8
         | 
| 83 | 
            +
                gr.Info(f"Prompt length: {prompt_len_seconds:.2f}s")
         | 
| 84 | 
            +
                with T.autocast(device_type='cuda', dtype=T.bfloat16):
         | 
| 85 | 
            +
                    completed_audio_batch = generator.completion(
         | 
| 86 | 
            +
                        encoded_prompt_audio, 
         | 
| 87 | 
            +
                        temps=(.8, (0.5, 0.1)), # (token_temp, (categorical_temp, gaussian_temp))
         | 
| 88 | 
            +
                        use_cache=True)
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                    completed_audio = completed_audio_batch
         | 
| 91 | 
            +
                    print_colored(f"Decoding completion...", "blue")
         | 
| 92 | 
            +
                    if TWO_SPEAKER:
         | 
| 93 | 
            +
                        decoded_completion_ch1 = audio_tokenizer.data_from_latent(completed_audio[:, :, :32].bfloat16())
         | 
| 94 | 
            +
                        decoded_completion_ch2 = audio_tokenizer.data_from_latent(completed_audio[:, :, 32:].bfloat16())
         | 
| 95 | 
            +
                        decoded_completion = T.cat([decoded_completion_ch1, decoded_completion_ch2], dim=0)
         | 
| 96 | 
            +
                    else:
         | 
| 97 | 
            +
                        decoded_completion = audio_tokenizer.data_from_latent(completed_audio.bfloat16())
         | 
| 98 | 
            +
                    gr.Info(f"Decoded completion shape: {decoded_completion.shape}")
         | 
| 99 | 
            +
             | 
| 100 | 
            +
                gr.Info("Preparing audio for playback...")
         | 
| 101 | 
            +
             | 
| 102 | 
            +
                audio_tensor = decoded_completion.cpu().squeeze()
         | 
| 103 | 
            +
                if audio_tensor.ndim == 1:
         | 
| 104 | 
            +
                    audio_tensor = audio_tensor.unsqueeze(0)
         | 
| 105 | 
            +
                audio_tensor = audio_tensor.float()
         | 
| 106 | 
            +
             | 
| 107 | 
            +
                if audio_tensor.abs().max() > 1:
         | 
| 108 | 
            +
                    audio_tensor = audio_tensor / audio_tensor.abs().max()
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                return audio_tensor[:, max(prompt_len*2000 - 16000, 0):]
         | 
| 111 |  | 
| 112 | 
             
            @spaces.GPU
         | 
| 113 | 
            +
            def run(audio_path):
         | 
| 114 | 
            +
                prompt_audio, prompt_len_seconds = load_and_preprocess_audio(audio_path)
         | 
| 115 | 
            +
                prompt_len = prompt_len_seconds * 8
         | 
| 116 | 
            +
                gr.Info("Encoding prompt...")
         | 
| 117 | 
            +
                with T.autocast(device_type='cuda', dtype=T.bfloat16):
         | 
| 118 | 
            +
                    if TWO_SPEAKER:
         | 
| 119 | 
            +
                        encoded_prompt_audio_ch1 = audio_tokenizer.latent_from_data(prompt_audio[:, 0:1].to(device))
         | 
| 120 | 
            +
                        encoded_prompt_audio_ch2 = audio_tokenizer.latent_from_data(prompt_audio[:, 1:2].to(device))
         | 
| 121 | 
            +
                        encoded_prompt_audio = T.cat([encoded_prompt_audio_ch1, encoded_prompt_audio_ch2], dim=-1)
         | 
| 122 | 
            +
                    else:
         | 
| 123 | 
            +
                        encoded_prompt_audio = audio_tokenizer.latent_from_data(prompt_audio.to(device))
         | 
| 124 | 
            +
                gr.Info(f"Encoded prompt shape: {encoded_prompt_audio.shape}")
         | 
| 125 | 
            +
                gr.Info("Prompt encoded successfully!")
         | 
| 126 | 
            +
                # num_completions = 10
         | 
| 127 | 
            +
                completion = get_completion(encoded_prompt_audio, prompt_len)
         | 
| 128 | 
            +
                return display_audio(completion)
         | 
| 129 | 
            +
             | 
|  | |
|  | |
|  | 
