AudioX

repository·main·Indexed 23 days ago

https://github.com/zeyuet/audiox

A unified framework for anything-to-audio generation supporting multimodal control signals including text, video, and audio. It utilizes a Multimodal Adaptive Fusion (MAF) module to enable tasks such as text-to-audio, video-to-music, and TV-to-audio. The project provides multiple pretrained models, including AudioX, AudioX-MAF, and AudioX-MAF-MMDiT, and includes a Gradio demo and a Python API for programmatic inference.

Tokens
2.9K
Snippets
4
Records
6
Agent score
32%

What's inside AudioX

  1. Supported AudioX Generation Tasks

    main

    AudioX supports various multimodal generation tasks based on the input combination of video_path, text_prompt, and audio_path:

    Taskvideo_pathtext_promptaudio_path
    Text-to-Audio (T2A)Nonee.g., "Typing on a keyboard"None
    Text-to-Music (T2M)Nonee.g., "A music with piano and violin"None
    Video-to-Audio (V2A)video_path.mp4e.g., "Generate general audio for the video"None
    Video-to-Music (V2M)video_path.mp4e.g., "Generate music for the video"None
    TV-to-Audio (TV2A)video_path.mp4e.g., "Ocean waves crashing with people laughing"None
    TV-to-Music (TV2M)video_path.mp4e.g., "Generate music with piano instrument"None
  2. Install AudioX

    main

    To set up the AudioX environment, follow these steps to clone the repository, create a Conda environment, and install the necessary dependencies and system libraries.

    Prerequisites

    • Python 3.8+
    • CUDA-capable GPU (recommended)
    • FFmpeg and libsndfile

    Installation Steps

    # Clone the repository
    git clone https://github.com/ZeyueT/AudioX.git
    cd AudioX
    
    # Create conda environment
    conda create -n AudioX python=3.8.20
    conda activate AudioX
    
    # Install dependencies
    pip install git+https://github.com/ZeyueT/AudioX.git
    conda install -c conda-forge ffmpeg libsndfile
  3. Launch the AudioX Gradio Demo

    main

    You can launch a web interface for AudioX using run_gradio.py. Using the --model flag will automatically download and load the specified model if it is not already present.

    Quick Start

    # Use AudioX model
    python3 run_gradio.py --model "AudioX" --share
    
    # Use AudioX-MAF model
    python3 run_gradio.py --model "AudioX-MAF" --share
    
    # Use AudioX-MAF-MMDiT model
    python3 run_gradio.py --model "AudioX-MAF-MMDiT" --share

    Custom Model Configuration

    If you have custom model files, specify them using --model-config and --ckpt-path:

    python3 run_gradio.py \
        --model-config model/config.json \
        --ckpt-path model/model.ckpt \
        --share

    Note: If --model is specified, --model-config and --ckpt-path are ignored.

    # Use AudioX model (automatically downloads if not present)
    python3 run_gradio.py --model "AudioX" --share
    
    # Use AudioX-MAF model
    python3 run_gradio.py --model "AudioX-MAF" --share
    
    # Use AudioX-MAF-MMDiT model
    python3 run_gradio.py --model "AudioX-MAF-MMDiT" --share
  4. Download AudioX Pretrained Checkpoints

    main

    AudioX provides three pretrained models on Hugging Face. You can download them manually into a model/ directory structure.

    Available Models

    1. AudioX: Base model for general audio and music generation.
    2. AudioX-MAF: Model with Multi-modal Adaptive Fusion (MAF) module.
    3. AudioX-MAF-MMDiT: Model with MAF and MMDiT.

    Manual Download Commands

    # Create model directory
    mkdir -p model
    
    # Download AudioX
    wget https://huggingface.co/HKUSTAudio/AudioX/resolve/main/model.ckpt -O model/AudioX/model.ckpt
    wget https://huggingface.co/HKUSTAudio/AudioX/resolve/main/config.json -O model/AudioX/config.json
    
    # Download AudioX-MAF
    wget https://huggingface.co/HKUSTAudio/AudioX-MAF/resolve/main/model.ckpt -O model/AudioX-MAF/model.ckpt
    wget https://huggingface.co/HKUSTAudio/AudioX-MAF/resolve/main/config.json -O model/AudioX-MAF/config.json
    
    # Download AudioX-MAF-MMDiT
    wget https://huggingface.co/HKUSTAudio/AudioX-MAF-MMDiT/resolve/main/model.ckpt -O model/AudioX-MAF-MMDiT/model.ckpt
    wget https://huggingface.co/HKUSTAudio/AudioX-MAF-MMDiT/resolve/main/config.json -O model/AudioX-MAF-MMDiT/config.json
    
    # Download synchformer
    wget https://huggingface.co/HKUSTAudio/AudioX-MAF/resolve/main/synchformer_state_dict.pth -O model/synchformer_state_dict.pth
    
    # Download VAE
    wget https://huggingface.co/HKUSTAudio/AudioX-MAF-MMDiT/resolve/main/VAE.ckpt -O model/VAE.ckpt
  5. Perform Programmatic Inference with the AudioX Python API

    main

    Use the audiox package to perform audio generation programmatically. This example demonstrates a Video-to-Music (V2M) generation task.

    Workflow

    1. Load Model: Use get_pretrained_model(model_name) to load the model and its configuration.
    2. Prepare Inputs:
      • Read video using read_video.
      • Load audio using load_and_process_audio (or use a zero tensor if no audio prompt is provided).
      • For AudioX-MAF or AudioX-MAF-MMDiT models, encode video with encode_video_with_synchformer.
    3. Generate: Call generate_diffusion_cond with the model and a conditioning list containing the prompts.
    4. Post-process: Rescale and convert the output tensor to int16 before saving with torchaudio.
    import torch
    import torchaudio
    from einops import rearrange
    from audiox import get_pretrained_model
    from audiox.inference.generation import generate_diffusion_cond
    from audiox.data.utils import read_video, merge_video_audio, load_and_process_audio, encode_video_with_synchformer
    import os
    
    device = "cuda" if torch.cuda.is_available() else "cpu"
    
    # Load pretrained model
    model_name = "HKUSTAudio/AudioX-MAF"
    model, model_config = get_pretrained_model(model_name)
    sample_rate = model_config["sample_rate"]
    sample_size = model_config["sample_size"]
    target_fps = model_config["video_fps"]
    seconds_start = 0
    seconds_total = 10
    
    model = model.to(device)
    
    # Example: Video-to-Music generation
    video_path = "example/V2M_sample-1.mp4"
    text_prompt = "Generate music for the video" 
    audio_path = None
    
    # Prepare inputs
    video_tensor = read_video(video_path, seek_time=seconds_start, duration=seconds_total, target_fps=target_fps)
    if audio_path:
        audio_tensor = load_and_process_audio(audio_path, sample_rate, seconds_start, seconds_total)
    else:
        # Use zero tensor when no audio is provided
        audio_tensor = torch.zeros((2, int(sample_rate * seconds_total)))
    
    # For AudioX-MAF and AudioX-MAF-MMDiT: encode video with synchformer
    video_sync_frames = None
    if "MAF" in model_name:
        video_sync_frames = encode_video_with_synchformer(
            video_path, model_name, seconds_start, seconds_total, device
        )
    
    # Create conditioning
    conditioning = [{
        "video_prompt": {"video_tensors": video_tensor.unsqueeze(0), "video_sync_frames": video_sync_frames},
        "text_prompt": text_prompt,
        "audio_prompt": audio_tensor.unsqueeze(0),
        "seconds_start": seconds_start,
        "seconds_total": seconds_total
    }]
        
    # Generate audio
    output = generate_diffusion_cond(
        model,
        steps=250,
        cfg_scale=7,
        conditioning=conditioning,
        sample_size=sample_size,
        sigma_min=0.3,
        sigma_max=500,
        sampler_type="dpmpp-3m-sde",
        device=device
    )
    
    # Post-process audio
    output = rearrange(output, "b d n -> d (b n)")
    output = output.to(torch.float32).div(torch.max(torch.abs(output))).clamp(-1, 1).mul(32767).to(torch.int16).cpu()
    torchaudio.save("output.wav", output, sample_rate)
    
    # Merge with video (optional)
    if video_path is not None and os.path.exists(video_path):
        merge_video_audio(video_path, "output.wav", "output.mp4", seconds_start, seconds_total)
    import torch
    import torchaudio
    from einops import rearrange
    from audiox import get_pretrained_model
    from audiox.inference.generation import generate_diffusion_cond
    from audiox.data.utils import read_video, merge_video_audio, load_and_process_audio, encode_video_with_synchformer
    import os
    
    device = "cuda" if torch.cuda.is_available() else "cpu"
    
    # Load pretrained model
    # Choose one: "HKUSTAudio/AudioX", "HKUSTAudio/AudioX-MAF", or "HKUSTAudio/AudioX-MAF-MMDiT"
    model_name = "HKUSTAudio/AudioX-MAF"
    model, model_config = get_pretrained_model(model_name)
    sample_rate = model_config["sample_rate"]
    sample_size = model_config["sample_size"]
    target_fps = model_config["video_fps"]
    seconds_start = 0
    seconds_total = 10
    
    model = model.to(device)
    
    # Example: Video-to-Music generation
    video_path = "example/V2M_sample-1.mp4"
    text_prompt = "Generate music for the video" 
    audio_path = None
    
    # Prepare inputs
    video_tensor = read_video(video_path, seek_time=seconds_start, duration=seconds_total, target_fps=target_fps)
    if audio_path:
        audio_tensor = load_and_process_audio(audio_path, sample_rate, seconds_start, seconds_total)
    else:
        # Use zero tensor when no audio is provided (following gradio implementation)
        audio_tensor = torch.zeros((2, int(sample_rate * seconds_total)))
    
    # For AudioX-MAF and AudioX-MAF-MMDiT: encode video with synchformer
    video_sync_frames = None
    if "MAF" in model_name:
        video_sync_frames = encode_video_with_synchformer(
            video_path, model_name, seconds_start, seconds_total, device
        )
    
    # Create conditioning (always include audio_prompt, using zero tensor if no audio)
    conditioning = [{
        "video_prompt": {"video_tensors": video_tensor.unsqueeze(0), "video_sync_frames": video_sync_frames},        
        "text_prompt": text_prompt,
        "audio_prompt": audio_tensor.unsqueeze(0),
        "seconds_start": seconds_start,
        "seconds_total": seconds_total
    }]
        
    # Generate audio
    output = generate_diffusion_cond(
        model,
        steps=250,
        cfg_scale=7,
        conditioning=conditioning,
        sample_size=sample_size,
        sigma_min=0.3,
        sigma_max=500,
        sampler_type="dpmpp-3m-sde",
        device=device
    )
    
    # Post-process audio
    output = rearrange(output, "b d n -> d (b n)")
    output = output.to(torch.float32).div(torch.max(torch.abs(output))).clamp(-1, 1).mul(32767).to(torch.int16).cpu()
    torchaudio.save("output.wav", output, sample_rate)
    
    # Merge with video (optional)
    if video_path is not None and os.path.exists(video_path):
        merge_video_audio(video_path, "output.wav", "output.mp4", seconds_start, seconds_total)
  6. Run Gradio Demo CLI Options

    main

    The run_gradio.py script accepts the following command-line arguments:

    OptionDescription
    --model MODEL_NAMEPredefined model name (AudioX, AudioX-MAF, AudioX-MAF-MMDiT)
    --model-config PATHPath to custom config.json
    --ckpt-path PATHPath to custom model checkpoint (.ckpt)
    --shareCreate a public Gradio share link
    --server-name ADDRESSServer address (default: 127.0.0.1)
    --server-port PORTServer port (default: 7860)