Spaces:
Sleeping
Sleeping
| # โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| # src/streamlit_app.py | |
| # โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| import os | |
| os.environ["STREAMLIT_HOME"] = "/tmp/.streamlit" | |
| # ้้ CORSใ้ๆไฝฟ็จ่ ็ตฑ่จ๏ผๅฏ้ธ๏ผ | |
| os.environ["STREAMLIT_SERVER_ENABLE_CORS"] = "false" | |
| os.environ["STREAMLIT_GATHER_USAGE_STATS"] = "false" | |
| # ๅปบ็ฎ้ | |
| os.makedirs("/tmp/.streamlit", exist_ok=True) | |
| # โโโโโโโโโโโโโโโ ๏ผ. ๆ DeepFace ็ HOME ๆๅฐ /tmp/.deepface โโโโโโโโโโโโโโโ | |
| os.environ["DEEPFACE_HOME"] = "/tmp/.deepface" | |
| # ๅปบๅฅฝ weights ๅญ็ฎ้๏ผDeepFace ไธ่ผๆฌ้ๅฐฑไธๆๅ mkdir / | |
| os.makedirs("/tmp/.deepface/weights", exist_ok=True) | |
| import streamlit as st | |
| import cv2, numpy as np, base64, io | |
| import librosa, joblib | |
| from deepface import DeepFace | |
| # โโ 1๏ธโฃ ่ผๅ ฅๆๆๆจกๅ๏ผDeepFace + ไฝ ็่ช้ณๆจกๅ๏ผโโ | |
| def load_models(): | |
| # a) DeepFace ้ ็ฑ | |
| DeepFace.analyze( | |
| img_path = np.zeros((224,224,3), dtype=np.uint8), | |
| actions = ['emotion'], | |
| enforce_detection=False | |
| ) | |
| # b) ่ผๅ ฅไฝ commit ๅฐ repo ็่ช้ณๆจกๅๆชๆก | |
| # ๅๅพ็ฎๅๆชๆก (streamlit_app.py) ็่ณๆๅคพ่ทฏๅพ | |
| root = os.path.dirname(__file__) | |
| # ็ถๅพๅพ src/ ๅบไธ่ฎๆจกๅๆช | |
| model_path = os.path.join(root, "voice_model.joblib") | |
| audio_model = joblib.load(model_path) | |
| return audio_model | |
| audio_model = load_models() | |
| # โโ 2๏ธโฃ ๆๆฌๆ ็ทๅๆๅฝๅผ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| def analyze_text_fn(text: str) -> str: | |
| if any(w in text for w in ["้ๅฟ","ๅฟซๆจ","ๆๅฟซ","ๅๆฆ","ๅๆ ","ๆญกๅ","่ๅฅฎ","้ซ่"]): | |
| return "happy" | |
| if any(w in text for w in ["็ๆฐฃ","ๆคๆ","ไธ็ฝ","็ผ็ซ","็ซๅคง","ๆฐฃๆค"]): | |
| return "angry" | |
| if any(w in text for w in ["ๅทๅฟ","้ฃ้","ๅญ","้ฃๅ","ๅฟ้ ธ","ๆ","ๆฒ","ๅ","็่ฆ","ๆ ","ๆ"]): | |
| return "sad" | |
| if any(w in text for w in ["้ฉ่จ","ๆๅค","ๅ","้ฉ่ฉซ","่ฉซ็ฐ","่จ็ฐ","ๅฅฝๅฅ"]): | |
| return "surprise" | |
| if any(w in text for w in ["ๆ","ๆๆผ","็ทๅผต","ๆผ","่ฝๆฏ","็"]): | |
| return "fear" | |
| return "neutral" | |
| # โโ 3๏ธโฃ ่ช้ณๆ ็ทๅๆๅฝๅผ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| def analyze_audio_fn(wav_bytes: bytes) -> str: | |
| # ่ฎ wav bytes | |
| y, sr = librosa.load(io.BytesIO(wav_bytes), sr=None) | |
| mfccs = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13) | |
| mf = np.mean(mfccs.T, axis=0) | |
| return audio_model.predict([mf])[0] | |
| # โโ 4๏ธโฃ Streamlit ไป้ข โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| st.set_page_config(page_title="ๅคๆจกๆ ๅณๆๆ ็ทๅๆ", layout="wide") | |
| st.title("๐ฑ ๅคๆจกๆ ๅณๆๆ ็ทๅๆ") | |
| tabs = st.tabs(["๐ด Face๏ผๆฌๅฐๆธฌ่ฉฆ๏ผ", "๐ค ไธๅณ่ช้ณๆช", "โจ๏ธ ่ผธๅ ฅๆๅญ"]) | |
| with tabs[0]: | |
| st.header("Live Face๏ผๅ ้ๆฌๅฐ็่ฆฝๅจๆธฌ่ฉฆ๏ผ") | |
| st.info("โ ๏ธ Hugging Face Spaces ็กๆณ็ดๆฅ้ๅๆๅฝฑๆฉ๏ผ่ซๅจๆฌๆฉไฝฟ็จ `streamlit run app.py` ๆธฌ่ฉฆใ") | |
| # ้้ๅฆๆ็จ streamlit-webrtc ๆ่ฝๅจๆฌๅฐๅผๅซๆๅฝฑๆฉ | |
| # ็็ฅ็คบ็ฏ๏ผๆๆนๆ gradio demo | |
| with tabs[1]: | |
| st.header("๐ค ไธๅณ WAV ๆช้ฒ่กๅๆ") | |
| # ๆฏๆด .wav ไธๅณ | |
| wav_file = st.file_uploader("่ซ้ธๆ .wav ้ณๆช", type=["wav"]) | |
| if wav_file is not None: | |
| # ่ฎ bytes๏ผๅผๅซๅๆๅฝๅผ | |
| wav_bytes = wav_file.read() | |
| emo = analyze_audio_fn(wav_bytes) | |
| st.success(f"๐ค ่ช้ณๅตๆธฌๅฐ็ๆ ็ท๏ผ**{emo}**") | |
| with tabs[2]: | |
| st.header("่ผธๅ ฅๆๅญ้ฒ่กๆ ็ทๅๆ") | |
| txt = st.text_area("่ซๅจๆญค่ผธๅ ฅๆๅญ") | |
| if st.button("้ๅงๅๆ"): | |
| emo = analyze_text_fn(txt) | |
| st.success(f"๐ ๆๆฌๅตๆธฌๅฐ็ๆ ็ท๏ผ**{emo}**") | |