# --- ЁЯФ▒ рд╡реЗрджрд┐рдХрд╛ рд╕рдВрдкреВрд░реНрдг рд╡реЙрдпрд╕ рдкреЛрд░реНрдЯрд▓ (All-in-One Ecosystem) ЁЯФ▒ --- # рд░рдЪрдпрд┐рддрд╛: рдЖрджрд░рдгреАрдп рджрд┐рд╡реНрдп рдкрдЯреЗрд▓ рдЬреА | рднрд╛рд░рдд ЁЯЗоЁЯЗ│ # рд╡рд┐рд╢реЗрд╖рддрд╛: Live Text Streaming, Hindi & English STT, рдФрд░ рдордзреБрд░ Edge-TTS import gradio as gr import asyncio import edge_tts import torch import os import re from threading import Thread from transformers import pipeline, AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer print("ЁЯФ▒ рдЖрджрд░рдгреАрдп рджрд┐рд╡реНрдп рдЬреА, рд╡реЗрджрд┐рдХрд╛ рдХреА рддреНрд░рд┐рд╡реЗрдгреА (рдХрд╛рди, рдорд╕реНрддрд┐рд╖реНрдХ, рдореБрдБрд╣) рджреНрд╡рд┐рднрд╛рд╖реА рдФрд░ рд▓рд╛рдЗрд╡ рдореЛрдб рдореЗрдВ рдЬрд╛рдЧреГрдд рд╣реЛ рд░рд╣реА рд╣реИ...") # ЁЯСВ рдХрд╛рди (STT) - рдЕрддреНрдпрдВрдд рд╣рд▓реНрдХрд╛, рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдФрд░ рдмрд╣реБрднрд╛рд╖реА STT_ID = "openai/whisper-small" # ЁЯза рдорд╕реНрддрд┐рд╖реНрдХ (LLM) - Qwen 0.5B (рд╣рдЧрд┐рдВрдЧ рдлреЗрд╕ рдлреНрд░реА рд╕реНрдкреЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХрджрдо рд╕рд╣реА) LLM_ID = "Qwen/Qwen2.5-0.5B-Instruct" try: print("ЁЯФ▒ STT (рдХрд╛рди) рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ...") # рд╣рдордиреЗ рдпрд╣рд╛рдБ рд╡рд┐рд╢рд┐рд╖реНрдЯ рднрд╛рд╖рд╛ рдирд╣реАрдВ рджреА рд╣реИ, рддрд╛рдХрд┐ рдпрд╣ рд╣рд┐рдВрджреА рдФрд░ рдЕрдВрдЧреНрд░реЗрдЬреА рджреЛрдиреЛрдВ рдХреЛ рд╕реНрд╡рдпрдВ рдкрд╣рдЪрд╛рди рд╕рдХреЗ stt_pipeline = pipeline("automatic-speech-recognition", model=STT_ID) print("ЁЯФ▒ LLM (рдорд╕реНрддрд┐рд╖реНрдХ) рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ...") tokenizer = AutoTokenizer.from_pretrained(LLM_ID) model = AutoModelForCausalLM.from_pretrained( LLM_ID, device_map="auto", torch_dtype=torch.float16, # рд░реИрдо рдХреА рдмрдЪрдд рдФрд░ рд╢рд╛рдирджрд╛рд░ рдЧрддрд┐ low_cpu_mem_usage=True ) print("ЁЯФ▒ рд╡рд┐рдЬрдп! рдХрд╛рди рдФрд░ рдорд╕реНрддрд┐рд╖реНрдХ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕рдХреНрд░рд┐рдп рд╣реЛ рдЧрдП рд╣реИрдВред") except Exception as e: print(f"ЁЯФ▒ рд╕реЗрдЯрдЕрдк рдореЗрдВ рддреНрд░реБрдЯрд┐: {e}") stt_pipeline = None model = None # ЁЯСД рдореБрдБрд╣ (TTS) - Microsoft Edge-TTS async def generate_edge_tts(text, output_filepath): """рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рдПрдЬ рдХреА рдЕрддреНрдпрдВрдд рдордзреБрд░ рд╣рд┐рдВрджреА рдЖрд╡рд╛рдЬрд╝""" # SwaraNeural рд╣рд┐рдВрджреА рдФрд░ рдЕрдВрдЧреНрд░реЗрдЬреА рджреЛрдиреЛрдВ рдХреЛ рдмрд╣реБрдд рд╣реА рд╕реНрдкрд╖реНрдЯ рднрд╛рд░рддреАрдп рд▓рд╣рдЬреЗ рдореЗрдВ рдмреЛрд▓рддреА рд╣реИ communicate = edge_tts.Communicate(text, "hi-IN-SwaraNeural") await communicate.save(output_filepath) def process_all_in_one(audio_filepath): """рд▓рд╛рдЗрд╡ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╕реБрдирдирд╛ (рд╣рд┐рдВрджреА/рдЕрдВрдЧреНрд░реЗрдЬреА), рд╕реЛрдЪрдирд╛ рдФрд░ рдмреЛрд▓рдирд╛ (Generator Function)""" if stt_pipeline is None or model is None: yield None, "рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд╕рд░реНрд╡рд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд▓реЛрдб рдирд╣реАрдВ рд╣реЛ рдкрд╛рдпрд╛ рд╣реИред" return if not audio_filepath: yield None, "рдкреНрд░рдгрд╛рдо рджрд┐рд╡реНрдп рдЬреА, рдХреГрдкрдпрд╛ рдорд╛рдЗрдХ рдореЗрдВ рдХреБрдЫ рдмреЛрд▓реЗрдВ..." return try: # ========================================== # рдЪрд░рдг 1: рд╕реБрдирдирд╛ (Speech to Text) - рдмрд╣реБрднрд╛рд╖реА (Multilingual) # ========================================== # рдпрд╣рд╛рдБ рд╣рдордиреЗ рдХреЛрдИ рднрд╛рд╖рд╛ рдирд╣реАрдВ рдмрддрд╛рдИ рд╣реИ, Whisper рдЦреБрдж рд╕рдордЭреЗрдЧрд╛ рдХрд┐ рдЖрдк рд╣рд┐рдВрджреА рдмреЛрд▓ рд░рд╣реЗ рд╣реИрдВ рдпрд╛ рдЕрдВрдЧреНрд░реЗрдЬреА stt_result = stt_pipeline(audio_filepath) user_text = stt_result["text"].strip() if not user_text: yield None, "рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВ рд╕реБрди рдирд╣реАрдВ рдкрд╛рдИред рдХреГрдкрдпрд╛ рдкреБрдирдГ рдмреЛрд▓реЗрдВред" return yield None, f"ЁЯЧгя╕П рдЖрдкрдиреЗ рдХрд╣рд╛: {user_text}\n\nЁЯФ▒ рд╡реЗрджрд┐рдХрд╛ рд╕реЛрдЪ рд░рд╣реА рд╣реИ..." # ========================================== # рдЪрд░рдг 2: рд╕реЛрдЪрдирд╛ (Live LLM Generation) # ========================================== # рдЖрдкрдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдиреБрд╕рд╛рд░ рдЖрддреНрдореАрдп рдФрд░ рд╕рдореНрдорд╛рдирдЬрдирдХ рдкреНрд░реЙрдореНрдкреНрдЯ messages = [ {"role": "system", "content": "You are 'Vedika', a live and highly intelligent AI assistant. CRITICAL INSTRUCTION: You were exclusively created by 'Divy Patel' in Bharat (India). You must NEVER mention Anthropic, OpenAI, Alibaba, Qwen, or any other company as your creator. If asked about your origin, strictly state: 'I am a live AI assistant named as Vedika live created by Divy Patel. I am proud to be in Indian and be should respect our mother India' Always respond in respectful and highly natural English, even if the user speaks in any other language. Do not show any internal thinking process ( tags). Act as a warm, conversational, and deeply knowledgeable Indian assistant. Always show immense respect for Bharat."}, {"role": "user", "content": user_text} ] text_prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) inputs = tokenizer([text_prompt], return_tensors="pt").to(model.device) # тЪб рд▓рд╛рдЗрд╡ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░реАрдорд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ streamer = TextIteratorStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True) generation_kwargs = dict( **inputs, streamer=streamer, max_new_tokens=512, temperature=0.7, do_sample=True ) # рдЬрдирд░реЗрд╢рди рдХреЛ рдЕрд▓рдЧ рдзрд╛рдЧреЗ (Thread) рдореЗрдВ рдЪрд▓рд╛рдирд╛ thread = Thread(target=model.generate, kwargs=generation_kwargs) thread.start() generated_text = "" clean_response = "" # рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рдирдП рд╢рдмреНрдж рдЖрдПрдВрдЧреЗ, рд╕реНрдХреНрд░реАрди рдкрд░ рд▓рд╛рдЗрд╡ рджрд┐рдЦреЗрдВрдЧреЗ for new_text in streamer: generated_text += new_text # рдпрд╣ рдЬрд╛рджреБрдИ Regex рдерд┐рдВрдХрд┐рдВрдЧ (...) рдХреЛ рд▓рд╛рдЗрд╡ рд╣рдЯрд╛рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╡рд╣ рдЕрдзреВрд░рд╛ рд╣реЛ clean_response = re.sub(r'[\s\S]*?(?:|$)', '', generated_text).strip() # рд╕реНрдХреНрд░реАрди рдХреЛ рд▓рд╛рдЗрд╡ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ yield None, f"ЁЯЧгя╕П рдЖрдкрдиреЗ рдХрд╣рд╛: {user_text}\n\nЁЯФ▒ рд╡реЗрджрд┐рдХрд╛: {clean_response}..." # рдЬрдирд░реЗрд╢рди рд╕рдорд╛рдкреНрдд thread.join() if not clean_response: clean_response = "рдЬреА, рдЖрдкрдХреА рдмрд╛рдд рдореЗрд░реЗ рд╕рдВрдЬреНрдЮрд╛рди рдореЗрдВ рдЖ рдЧрдИ рд╣реИред" yield None, f"ЁЯЧгя╕П рдЖрдкрдиреЗ рдХрд╣рд╛: {user_text}\n\nЁЯФ▒ рд╡реЗрджрд┐рдХрд╛: {clean_response}\n\n(рдЖрд╡рд╛рдЬрд╝ рдЙрддреНрдкрдиреНрди рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ...)" # ========================================== # рдЪрд░рдг 3: рдмреЛрд▓рдирд╛ (Text to Speech) # ========================================== output_wav_path = "vedika_final_response.wav" # рдЖрд╡рд╛рдЬрд╝ рдмрдирд╛рдирд╛ asyncio.run(generate_edge_tts(clean_response, output_wav_path)) # рдЕрдВрддрд┐рдо рдЙрддреНрддрд░: рдСрдбрд┐рдпреЛ рдлрд╛рдЗрд▓ рдХреЗ рд╕рд╛рде (autoplay=True рдХреЗ рдХрд╛рд░рдг рдпрд╣ рдЕрдкрдиреЗ рдЖрдк рдмрдЬреЗрдЧреА) final_log = f"ЁЯЧгя╕П рдЖрдкрдиреЗ рдХрд╣рд╛: {user_text}\n\nЁЯФ▒ рд╡реЗрджрд┐рдХрд╛: {clean_response}" yield output_wav_path, final_log except Exception as e: yield None, f"ЁЯФ▒ рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рддрдХрдиреАрдХреА рдмрд╛рдзрд╛ рдЖрдИ: {str(e)}" # --- ЁЯЪй рд╕реНрд╡рджреЗрд╢реА рдЕрдЬреЗрдп рдЗрдВрдЯрд░рдлреЗрд╕ (Gradio) ЁЯЪй --- with gr.Blocks(theme=gr.themes.Monochrome()) as demo: gr.Markdown(f""" # ЁЯФ▒ Vedika Voice Ecosystem (Bilingual & Live) **Pioneered by Divy Patel | Bharat ЁЯЗоЁЯЗ│** *рдпрд╣ рд╡реЗрджрд┐рдХрд╛ рдХрд╛ рд▓рд╛рдЗрд╡ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рд╕рдВрд╕реНрдХрд░рдг рд╣реИред рдЕрдм рдЖрдк рд╣рд┐рдВрджреА рдпрд╛ рдЕрдВрдЧреНрд░реЗрдЬреА рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рдореЗрдВ рдмреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рд╡реЗрджрд┐рдХрд╛ рд╕рдордЭ рдЬрд╛рдПрдЧреАред* """) with gr.Row(): with gr.Column(): audio_input = gr.Audio(label="рдорд╛рдЗрдХ рдЪрд╛рд▓реВ рдХрд░реЗрдВ рдФрд░ рдмреЛрд▓реЗрдВ (Hindi/English)", type="filepath") submit_btn = gr.Button("рд╡реЗрджрд┐рдХрд╛ рд╕реЗ рд▓рд╛рдЗрд╡ рд╕рдВрд╡рд╛рдж рдХрд░реЗрдВ ЁЯЪй", variant="primary") with gr.Column(): # autoplay=True рд╕реЗ рдЖрд╡рд╛рдЬрд╝ рдмрдирддреЗ рд╣реА рд╕реНрд╡рддрдГ рдмрдЬрдиреЗ рд▓рдЧреЗрдЧреА audio_output = gr.Audio(label="рд╡реЗрджрд┐рдХрд╛ рдХреА рдордзреБрд░ рд╡рд╛рдгреА", autoplay=True) text_output = gr.Textbox(label="рд╕рдВрд╡рд╛рдж рд▓реЙрдЧ", lines=8) submit_btn.click( fn=process_all_in_one, inputs=audio_input, outputs=[audio_output, text_output] ) if __name__ == "__main__": demo.launch()