File size: 4,523 Bytes
7c9c433
602af10
7c9c433
5c35c36
abae343
 
 
 
 
 
1c23832
abae343
 
 
 
1c23832
61c41ee
7c9c433
 
31f3668
 
6c948c7
e7c3482
7c9c433
 
e7c3482
31f3668
7c9c433
602af10
31f3668
 
 
e7c3482
7c9c433
1ac90c3
 
 
 
 
 
31f3668
e7c3482
31f3668
e7c3482
7c9c433
 
 
 
e7c3482
 
 
 
 
7c9c433
e7c3482
 
 
7c9c433
 
e7c3482
7c9c433
 
 
31f3668
602af10
31f3668
 
602af10
 
7c9c433
 
 
e7c3482
7c9c433
602af10
7c9c433
 
 
 
 
602af10
e7c3482
793587e
 
 
7c9c433
793587e
 
 
7c9c433
6c948c7
793587e
e7c3482
7c9c433
 
31f3668
602af10
7c9c433
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# 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}**")