File size: 4,833 Bytes
74245b5 b8d465b 97778aa 031a7f3 b8d465b 48ade8d 896ca54 310ebea db5919c 07cb903 5753bc2 b8d465b 310ebea aa10e55 310ebea 54be90e db5919c 97778aa 54be90e 5753bc2 b66d512 db5919c b66d512 896ca54 3c8678d db5919c 1668d21 5753bc2 1668d21 3c8678d 5753bc2 db5919c 5753bc2 896ca54 db5919c 33f9554 db5919c 5753bc2 db5919c 5753bc2 db5919c c10cafd db5919c aa10e55 db5919c 5753bc2 db5919c 896ca54 97778aa 5753bc2 db5919c 5753bc2 310ebea 5753bc2 b8d465b 33f9554 74245b5 a727789 5753bc2 33f9554 5753bc2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
import gradio as gr
import google.generativeai as genai
import numpy as np
import re
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from huggingface_hub import snapshot_download, login
import logging
import os
import spaces
import warnings
from snac import SNAC
from dotenv import load_dotenv
load_dotenv()
# Set up logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
# Suppress specific warnings
warnings.filterwarnings("ignore", category=UserWarning)
warnings.filterwarnings("ignore", category=RuntimeWarning)
def get_device():
return "cuda" if torch.cuda.is_available() else "cpu"
device = get_device()
logger.info(f"Using device: {device}")
model = None
tokenizer = None
snac_model = None
@spaces.GPU()
def load_model():
global model, tokenizer, snac_model
logger.info("Loading SNAC model...")
snac_model = SNAC.from_pretrained("hubertsiuzdak/snac_24khz")
snac_model = snac_model.to(device)
logger.info("Loading Orpheus model...")
model_name = "canopylabs/orpheus-3b-0.1-ft"
hf_token = os.environ.get("HUGGINGFACE_TOKEN")
if not hf_token:
raise ValueError("HUGGINGFACE_TOKEN environment variable is not set")
try:
login(token=hf_token)
snapshot_download(
repo_id=model_name,
use_auth_token=hf_token,
allow_patterns=[
"config.json",
"*.safetensors",
"model.safetensors.index.json",
],
ignore_patterns=[
"optimizer.pt",
"pytorch_model.bin",
"training_args.bin",
"scheduler.pt",
"tokenizer.json",
"tokenizer_config.json",
"special_tokens_map.json",
"vocab.json",
"merges.txt",
"tokenizer.*"
]
)
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.bfloat16)
model.to(device)
tokenizer = AutoTokenizer.from_pretrained(model_name)
logger.info(f"Orpheus model and tokenizer loaded to {device}")
except Exception as e:
logger.error(f"Error loading model: {str(e)}")
raise
@spaces.GPU()
def text_to_speech(text, voice, temperature=0.6, top_p=0.95, repetition_penalty=1.1, max_new_tokens=1200):
global model, tokenizer, snac_model
if model is None or tokenizer is None or snac_model is None:
load_model()
if not text.strip():
return None
try:
input_ids, attention_mask = process_prompt(text, voice, tokenizer, device)
with torch.no_grad():
generated_ids = model.generate(
input_ids=input_ids,
attention_mask=attention_mask,
max_new_tokens=max_new_tokens,
do_sample=True,
temperature=temperature,
top_p=top_p,
repetition_penalty=repetition_penalty,
num_return_sequences=1,
eos_token_id=128258,
)
code_list = parse_output(generated_ids)
audio_samples = redistribute_codes(code_list, snac_model)
return (24000, audio_samples) # Return sample rate and audio
except Exception as e:
logger.error(f"Error in text_to_speech: {str(e)}")
raise
@spaces.GPU()
def render_podcast(api_key, script, voice1, voice2, num_hosts):
try:
lines = [line for line in script.split('\n') if line.strip()]
audio_segments = []
for i, line in enumerate(lines):
voice = voice1 if num_hosts == 1 or i % 2 == 0 else voice2
try:
sample_rate, audio = text_to_speech(line, voice)
audio_segments.append(audio)
except Exception as e:
logger.error(f"Error processing audio segment: {str(e)}")
if not audio_segments:
logger.warning("No valid audio segments were generated.")
return (24000, np.zeros(24000, dtype=np.float32))
podcast_audio = np.concatenate(audio_segments)
# Ensure the audio is in the correct format for Gradio
podcast_audio = np.clip(podcast_audio, -1, 1)
podcast_audio = (podcast_audio * 32767).astype(np.int16)
return (24000, podcast_audio)
except Exception as e:
logger.error(f"Error rendering podcast: {str(e)}")
raise
# ... (rest of the code remains the same)
if __name__ == "__main__":
try:
load_model() # Load models at startup
demo.launch()
except Exception as e:
logger.error(f"Error launching the application: {str(e)}") |