import streamlit as st import requests import os import tempfile import io import soundfile as sf # Hugging Face API Key (Make sure to add it in your HF Space secrets) HF_API_KEY = os.getenv("HF_API_KEY") HEADERS = {"Authorization": f"Bearer {HF_API_KEY}"} # Hugging Face Model APIs HF_SPEECH_TO_TEXT_API = "https://api-inference.huggingface.co/models/openai/whisper-small" HF_CHATBOT_API = "https://api-inference.huggingface.co/models/mistralai/Mistral-7B-Instruct" HF_TEXT_TO_SPEECH_API = "https://api-inference.huggingface.co/models/facebook/mms-tts-eng" # Chinese Zodiac Avatars with Personalities avatars = { "Rat": "Clever and resourceful. Loves puzzles and word games.", "Ox": "Patient and wise. Encourages steady learning.", "Tiger": "Brave and adventurous. Loves storytelling!", "Rabbit": "Gentle and kind. Makes learning fun and safe.", "Dragon": "Bold and confident. Loves to challenge students!", "Snake": "Calm and analytical. Gives insightful explanations.", "Horse": "Energetic and playful. Encourages fast-paced learning!", "Goat": "Creative and artistic. Uses imagination in learning.", "Monkey": "Curious and mischievous. Always has fun facts!", "Rooster": "Diligent and disciplined. Helps with structured learning.", "Dog": "Loyal and friendly. Encourages confidence.", "Pig": "Easygoing and supportive. Encourages relaxed learning." } # Function to process speech-to-text def speech_to_text(audio_path): with open(audio_path, "rb") as f: files = {"file": f} response = requests.post(HF_SPEECH_TO_TEXT_API, headers=HEADERS, files=files) return response.json().get("text", "Could not transcribe audio.") # Function to get chatbot response def chatbot_response(user_input, avatar): personality = avatars.get(avatar, "Friendly and supportive.") prompt = f"You are {avatar}, an AI speaking coach. You are {personality}.\n" prompt += f"Help the student practice English in a fun and engaging way.\n" prompt += f"User: {user_input}\n{avatar}:" payload = {"inputs": prompt} response = requests.post(HF_CHATBOT_API, headers=HEADERS, json=payload) return response.json().get("generated_text", "I'm here to help!") # Function for text-to-speech def text_to_speech(text): payload = {"inputs": text} response = requests.post(HF_TEXT_TO_SPEECH_API, headers=HEADERS, json=payload) return response.content # Streamlit UI st.title("🎙️ AI Speaking Coach - Talking Pals") st.write("Choose an avatar and start speaking!") # Select Avatar avatar = st.selectbox("Pick your speaking coach:", list(avatars.keys())) st.write(f"**{avatar}** - {avatars[avatar]}") # Upload or record audio audio_file = st.file_uploader("Record or upload your voice", type=["wav", "mp3"]) show_text = st.checkbox("Show conversation text") if audio_file: with tempfile.NamedTemporaryFile(delete=False, suffix=".wav") as tmpfile: tmpfile.write(audio_file.getvalue()) tmpfile_path = tmpfile.name st.audio(tmpfile_path) user_text = speech_to_text(tmpfile_path) if show_text: st.write(f"**You:** {user_text}") ai_reply = chatbot_response(user_text, avatar) if show_text: st.write(f"**{avatar}:** {ai_reply}") speech_audio = text_to_speech(ai_reply) audio_bytes = io.BytesIO(speech_audio) st.audio(audio_bytes, format="audio/wav")