shaikrabbani-dev's picture
Update app.py
efa217a verified
Raw
History Blame Contribute Delete
7.41 kB
# ========================================== #
# 0. HUGGING FACE ZERO-GPU INITIALIZATION #
# ========================================== #
try:
import spaces
except ImportError:
class spaces:
@staticmethod
def GPU(fn):
return fn
import os
import uuid
import whisper
import gradio as gr
import soundfile as sf
import numpy as np
import scipy.io.wavfile as wav
from groq import Groq
from f5_tts.api import F5TTS
# ========================================== #
# 1. System Setup & Configuration #
# ========================================== #
GROQ_API_KEY = os.environ.get("GROQ_API_KEY", "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")
voice_file = "my_voice_fixed.wav"
if not os.path.exists(voice_file):
print(f"⚠️ Reference audio file '{voice_file}' not found! Creating safe baseline array profile...")
sample_rate = 24000
duration = 1.0
audio_data = np.zeros(int(sample_rate * duration), dtype=np.int16)
wav.write(voice_file, sample_rate, audio_data)
groq_client = Groq(api_key=GROQ_API_KEY) if GROQ_API_KEY else None
whisper_model = None
f5tts = None
auto_reference_text = None
# ========================================== #
# 2. Dynamic Text Response Generation #
# ========================================== #
def get_ai_answer(question):
global groq_client
if not GROQ_API_KEY:
return "Please add your active GROQ_API_KEY into Hugging Face Settings -> Secrets to chat."
try:
if groq_client is None:
groq_client = Groq(api_key=GROQ_API_KEY)
chat_completion = groq_client.chat.completions.create(
messages=[
{
"role": "system",
"content": "You are an informative voice simulation assistant. Provide comprehensive, detailed, and clear explanations. Avoid single-sentence answers."
},
{"role": "user", "content": question}
],
model="llama-3.3-70b-versatile",
max_tokens=250, # INCREASED: Allows for longer, more detailed descriptions
timeout=15
)
return chat_completion.choices[0].message.content.strip()
except Exception as e:
print(f"⚠️ Groq API issue detected: {e}")
return f"The AI engine is currently offline. Details: {str(e)}"
# ========================================== #
# 3. Native Voice Synthesis Processing #
# ========================================== #
def clone_and_speak(text):
global f5tts, auto_reference_text
try:
if "offline" in text.lower() or "secrets" in text.lower():
return None
unique_filename = f"voice_output_{uuid.uuid4().hex[:8]}.wav"
print(f"πŸ”Š Rendering voice cloning track for text: '{text}'")
if f5tts is None:
print("Loading F5-TTS Core Neural Simulator...")
f5tts = F5TTS()
if auto_reference_text is None:
auto_reference_text = "Hi, my name is Rabbani. I am software engineering in the Gamana solution."
result = f5tts.infer(
ref_file=voice_file,
ref_text=auto_reference_text,
gen_text=text
)
if isinstance(result, tuple):
if len(result) == 2:
audio_data, sample_rate = result[0], result[1]
elif len(result) >= 3:
audio_data, sample_rate = result[0], result[1]
else:
audio_data, sample_rate = result[0], 24000
else:
audio_data, sample_rate = result, 24000
if hasattr(audio_data, "cpu"):
audio_data = audio_data.cpu().numpy()
elif hasattr(audio_data, "numpy"):
audio_data = audio_data.numpy()
audio_data = np.squeeze(audio_data)
sf.write(unique_filename, audio_data, sample_rate, format='WAV')
if os.path.exists(unique_filename) and os.path.getsize(unique_filename) > 0:
print(f"πŸŽ‰ Generated track successfully saved to: {unique_filename}")
return unique_filename
return None
except Exception as e:
print(f"❌ Core TTS System Exception triggered: {e}")
return None
# ========================================== #
# 4. Request Router Pipeline #
# ========================================== #
@spaces.GPU
def chatbot_engine(text_input, audio_input):
global whisper_model, auto_reference_text
if whisper_model is None:
print("Loading Lightweight Whisper Engine...")
whisper_model = whisper.load_model("tiny")
if auto_reference_text is None:
try:
ref_result = whisper_model.transcribe(voice_file, fp16=False)
auto_reference_text = ref_result["text"].strip()
if not auto_reference_text:
auto_reference_text = "Hi, my name is Rabbani. I am software engineering in the Gamana solution."
except Exception:
auto_reference_text = "Hi, my name is Rabbani. I am software engineering in the Gamana solution."
if audio_input is not None:
user_transcription = whisper_model.transcribe(audio_input, fp16=False)
question = user_transcription["text"]
elif text_input and text_input.strip() != "":
question = text_input
else:
return "System Notification: Please enter a text question or record your microphone.", None
ai_text_response = get_ai_answer(question)
generated_audio_track = clone_and_speak(ai_text_response)
return ai_text_response, generated_audio_track, gr.update(value=""), gr.update(value=None)
# ========================================== #
# 5. Full-Output Single-Page UI Canvas #
# ========================================== #
with gr.Blocks(title="Rabbani A I voice clone") as interface:
gr.Markdown("# πŸŽ™οΈ Rabbani A I voice clone")
gr.Markdown("Type or speak your question below. The system processes the response dynamically and outputs both text and voice simulation results simultaneously.")
with gr.Row():
with gr.Column(scale=1):
gr.Markdown("### πŸ’¬ Input Interaction Canvas")
text_prompt_box = gr.Textbox(placeholder="Type your custom question query here...", label="Your Written Question")
audio_prompt_box = gr.Audio(label="Or Record/Speak Your Question Directly", type="filepath")
submit_btn = gr.Button("Send Question to AI Engine", variant="primary")
clear_btn = gr.ClearButton(value="Clear Inputs")
with gr.Column(scale=1):
gr.Markdown("### πŸ“Š Cloned Output Responses")
text_output_box = gr.Textbox(label="AI Answer Text Output", interactive=False)
audio_output_player = gr.Audio(
label="Rendered Cloned Response Audio Player",
type="filepath",
interactive=False
)
submit_btn.click(
fn=chatbot_engine,
inputs=[text_prompt_box, audio_prompt_box],
outputs=[text_output_box, audio_output_player, text_prompt_box, audio_prompt_box]
)
clear_btn.add([text_prompt_box, audio_prompt_box, text_output_box, audio_output_player])
interface.queue().launch()