real-time-emotion / src /streamlit_app.py
GCLing's picture
Update src/streamlit_app.py
5c35c36 verified
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# 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 + ไฝ ็š„่ชž้Ÿณๆจกๅž‹๏ผ‰โ”€โ”€
@st.cache_resource(show_spinner=False)
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}**")