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}**") | |