ACE-Music-Generator / vibevoice_integration.py
ACloudCenter's picture
Add API endpoint and fix deprecation warnings
009c9f3
"""
Integration code for VibeVoice-PodcastCreator to use ACE-Music-Generator
Add this to your VibeVoice space to generate background music on demand.
"""
from gradio_client import Client
import numpy as np
from scipy.io import wavfile
import tempfile
import os
class MusicGenerator:
"""
Music generator client for VibeVoice podcast creation
"""
def __init__(self, space_name="ACloudCenter/ACE-Music-Generator"):
"""Initialize connection to music generator space"""
try:
self.client = Client(space_name)
self.connected = True
except:
print("Warning: Could not connect to music generator. Music features disabled.")
self.connected = False
def generate_intro_music(self, duration=10):
"""Generate intro music for podcast"""
if not self.connected:
return None
return self._generate(
duration=duration,
tags="podcast intro, upbeat, electronic, professional, 120 bpm, energetic",
lyrics="[instrumental]"
)
def generate_outro_music(self, duration=10):
"""Generate outro music for podcast"""
if not self.connected:
return None
return self._generate(
duration=duration,
tags="podcast outro, calm, ambient, soft, 80 bpm, fade out, peaceful",
lyrics="[instrumental]"
)
def generate_background_music(self, style="ambient", duration=30):
"""
Generate background music for podcast segments
Styles:
- ambient: Soft background music
- news: Professional news-style background
- dramatic: Intense, dramatic music
- tech: Futuristic tech music
- chill: Relaxed lofi music
"""
styles = {
"ambient": "ambient, soft, background, minimal, 70 bpm, atmospheric",
"news": "news, professional, subtle, electronic, 90 bpm, serious",
"dramatic": "dramatic, orchestral, cinematic, 100 bpm, intense",
"tech": "electronic, futuristic, synth, 110 bpm, innovative",
"chill": "lofi, relaxed, warm, 75 bpm, cozy, mellow"
}
if not self.connected:
return None
tags = styles.get(style, styles["ambient"])
return self._generate(duration=duration, tags=tags, lyrics="[instrumental]")
def generate_commercial_jingle(self, duration=5):
"""Generate a short commercial jingle"""
if not self.connected:
return None
return self._generate(
duration=duration,
tags="jingle, commercial, catchy, upbeat, 140 bpm, happy, memorable",
lyrics="[instrumental]"
)
def _generate(self, duration, tags, lyrics):
"""Internal method to generate music"""
try:
result = self.client.predict(
duration,
tags,
lyrics,
60, # infer_steps
15.0, # guidance_scale
api_name="/generate"
)
return result
except Exception as e:
print(f"Error generating music: {e}")
return None
def mix_with_podcast(self, podcast_audio_path, music_path, music_volume=0.2):
"""
Mix background music with podcast audio
Args:
podcast_audio_path: Path to podcast audio file
music_path: Path to music file
music_volume: Volume of music (0-1, lower = quieter background)
Returns:
mixed_audio_path: Path to mixed audio file
"""
try:
# Load audio files
podcast_rate, podcast_data = wavfile.read(podcast_audio_path)
music_rate, music_data = wavfile.read(music_path)
# Ensure same sample rate
if podcast_rate != music_rate:
# Simple resampling (you might want to use librosa for better quality)
music_data = np.interp(
np.linspace(0, len(music_data), int(len(music_data) * podcast_rate / music_rate)),
np.arange(len(music_data)),
music_data
)
# Match lengths
if len(music_data) < len(podcast_data):
# Loop music if it's shorter
music_data = np.tile(music_data, (len(podcast_data) // len(music_data) + 1))
music_data = music_data[:len(podcast_data)]
# Mix audio
mixed = podcast_data + (music_data * music_volume)
# Normalize to prevent clipping
mixed = np.clip(mixed, -32768, 32767).astype(np.int16)
# Save mixed audio
output_path = tempfile.mktemp(suffix=".wav")
wavfile.write(output_path, podcast_rate, mixed)
return output_path
except Exception as e:
print(f"Error mixing audio: {e}")
return podcast_audio_path # Return original if mixing fails
# Example usage in VibeVoice generator
def enhance_podcast_with_music(podcast_generator):
"""
Example of how to add this to your existing podcast generator
"""
# Initialize music generator
music_gen = MusicGenerator()
# Your existing podcast generation code
# podcast_audio = podcast_generator.generate_podcast(...)
# Generate intro music
intro_music = music_gen.generate_intro_music(duration=5)
# Generate background music for main content
background_music = music_gen.generate_background_music(
style="ambient",
duration=60 # Adjust based on your podcast length
)
# Generate outro music
outro_music = music_gen.generate_outro_music(duration=5)
# Mix background music with podcast (optional)
# if background_music and podcast_audio:
# mixed_audio = music_gen.mix_with_podcast(
# podcast_audio,
# background_music,
# music_volume=0.1 # Keep it quiet in background
# )
return {
"intro": intro_music,
"background": background_music,
"outro": outro_music
}
# Quick function to add to your VibeVoice app.py
def add_music_generation_to_vibevoice():
"""
Add this to your VibeVoice app.py to integrate music generation
"""
# In your create_demo() function, add:
"""
# Add music generator
music_gen = MusicGenerator()
# Add checkbox for music generation
with gr.Row():
add_intro_music = gr.Checkbox(label="Add Intro Music", value=False)
add_outro_music = gr.Checkbox(label="Add Outro Music", value=False)
add_background_music = gr.Checkbox(label="Add Background Music", value=False)
background_style = gr.Dropdown(
choices=["ambient", "news", "dramatic", "tech", "chill"],
value="ambient",
label="Background Music Style"
)
# In your generation function:
def generate_with_music(..., add_intro, add_outro, add_background, bg_style):
# Your existing generation code
podcast_audio = generate_podcast(...)
# Add music if requested
if add_intro:
intro = music_gen.generate_intro_music(5)
# Concatenate intro with podcast
if add_background:
bg_music = music_gen.generate_background_music(bg_style, duration=60)
# Mix with podcast audio
if add_outro:
outro = music_gen.generate_outro_music(5)
# Concatenate outro
return final_audio
"""
pass
if __name__ == "__main__":
# Test the music generator
print("Testing music generator...")
music_gen = MusicGenerator()
print("Generating intro music...")
intro = music_gen.generate_intro_music(duration=5)
if intro:
print(f"Intro music saved to: {intro}")
print("Generating background music...")
background = music_gen.generate_background_music(style="ambient", duration=10)
if background:
print(f"Background music saved to: {background}")
print("Done!")