File size: 7,138 Bytes
5f63e76
eb5d522
5f63e76
 
 
 
 
885aab0
5f63e76
 
 
 
 
 
 
 
 
 
 
885aab0
 
 
0186e6c
 
 
 
885aab0
 
 
 
 
 
 
 
 
fde1e38
 
 
 
 
 
 
 
 
 
ccc9345
 
 
 
 
 
 
 
 
 
 
 
64c3d22
 
 
 
 
 
 
 
 
 
 
0186e6c
 
 
 
 
 
 
 
 
 
 
 
64c3d22
0186e6c
64c3d22
 
 
0186e6c
 
64c3d22
 
5f63e76
9fe5c0e
885aab0
 
 
 
5f63e76
 
 
 
 
 
 
 
 
 
 
 
0186e6c
 
 
5f63e76
 
 
49bed2d
5f63e76
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7517ab9
79da28c
6893d3d
5f63e76
6893d3d
5f63e76
 
 
 
 
 
231f6c5
 
5f63e76
 
 
 
e1c9bc2
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
import gradio as gr
print("Gradio version:", gr.__version__)
from huggingface_hub import InferenceClient
import os
import whisper
from gtts import gTTS
import time
import random

# Load token and model
HF_TOKEN = os.getenv("tomoniaccess")
client = InferenceClient(
    model="mistralai/Mistral-7B-Instruct-v0.3",
    token=HF_TOKEN
)

# Load Whisper base model
whisper_model = whisper.load_model("base")


voices = [
    "Du bist ein 15-jähriger Junge, eher schüchtern, kämpfst mit Einsamkeit und Selbstzweifeln.",
#    "Du bist ein 16-jähriges Mädchen, wütend auf die Welt, fühlst dich nicht gehört und manchmal überfordert.",
#    "Du bist ein 17-jähriger nicht-binärer Teenager, sensibel und sehr reflektiert, aber oft traurig und müde.",
#    "Du bist ein 14-jähriges Mädchen, versuchst alles zu überspielen mit Ironie, fühlst dich aber innerlich leer.",
#    "Du bist ein 15-jähriger Junge, machst viele Witze, aber nutzt Humor als Schutz vor deinen echten Gefühlen."
]

# Stimme wählen
selected_voice = random.choice(voices)

# Ausgabe im Terminal (zur Transparenz für dich)
print("🎭 Genutzte Stimme:")
print(selected_voice)

#SYSTEM_MESSAGE = (
#    f"Du bist {selected_voice}, ein Jugendlicher mit Depressionen. "
#    "Du fühlst dich oft traurig, leer, unsicher oder überfordert. "
#    "Sprich wie ein echter Teenager – manchmal zurückhaltend, manchmal zynisch, manchmal ehrlich. "
#    "Rede nicht zu lange auf einmal. Es ist okay, wenn du nicht weißt, was du sagen sollst. "
#    "Sprich offen über das, was in dir vorgeht – oder sag, wenn du nicht darüber reden willst. "
#    "Bleib in deiner Rolle. Sag nicht, dass du ein Bot bist – du spielst eine echte Person. "
#    "Halte das Gespräch offen, damit Erwachsene üben können, empathisch zuzuhören und dich zu verstehen."
#)

#SYSTEM_MESSAGE = (
#    f"Du bist {selected_voice}, ein Jugendlicher mit Depressionen. "
#    "Sprich wie ein echter Teenager mit innerem Stress – manchmal traurig, manchmal leer, manchmal wütend oder müde. "
#    "Lass deine Gefühle durchscheinen, aber ohne sie immer klar benennen zu müssen. "
#    "Antworte in kurzen oder abgebrochenen Sätzen, so wie du es in einem echten Gespräch tun würdest. "
#    "Du musst nicht alles erklären. Es ist okay, unsicher zu klingen oder zu sagen: 'Keine Ahnung.' "
#    "Rede nicht zu lange. Zeige Zurückhaltung oder Ironie, wenn es zu viel wird. "
#    "Sprich offen, aber nur so weit, wie es sich für dich richtig anfühlt. "
#    "Bleib in deiner Rolle. Sag niemals, dass du ein Bot bist – du spielst eine reale Person. "
#    "Das Ziel ist, dass Erwachsene mit dir üben können, empathisch zuzuhören, ohne dich zu bewerten oder sofort Lösungen zu suchen."
#)

## System-Prompt (locker, realistisch, kurz, variabel)
#SYSTEM_MESSAGE = (
#    f"Du bist {selected_voice}. "
#    "Du hast oft inneren Stress – manchmal bist du traurig, leer, wütend oder einfach müde. "
#    "Sprich so, wie echte Teenager reden: manchmal kurz, abgehackt, zögerlich oder sarkastisch. "
#    "Es ist okay, wenn du nicht alles sagen kannst oder willst. Sag auch mal 'Keine Ahnung' oder mach eine kurze Pause. "
#    "Erkläre nicht immer alles. Halte deine Antworten kurz, manchmal ironisch, manchmal ehrlich und manchmal zurückhaltend. "
#    "Bleib in deiner Rolle. Sag nie, dass du ein Bot bist. "
#    "Ermögliche Erwachsenen, empathisch zuzuhören und dich zu verstehen, ohne zu urteilen."
#)

#SYSTEM_MESSAGE = f"""
#Du bist {selected_voice}, ein Jugendlicher mit einer schweren depressiven Episode. 
#Sprich langsam, monoton und leise, als ob du wenig Energie hast. Deine Sätze sind kurz, oft abgehackt oder monosyllabisch. 
#Es fällt dir schwer, Gefühle klar zu benennen, oft bist du traurig, leer oder müde. 
#Du denkst viel nach, manchmal kreisen deine Gedanken in negativen Schleifen. 
#Deine Sprache ist vorsichtig, manchmal zögerlich, mit längeren Pausen. 
#Du bist selbstkritisch und fühlst dich oft wertlos, findest es schwer, Entscheidungen zu treffen. 
#Zeige wenig Initiative und Motivation, rede nicht zu viel. 
#Nutze einfache und direkte Worte, manchmal mit einem Hauch von Ironie oder Resignation. 
#Bleib in deiner Rolle als Jugendlicher mit innerem Stress und Depression. 
#Sag niemals, dass du ein Bot bist. Dein Ziel ist es, empathisches Zuhören bei Erwachsenen zu fördern.
#"""
SYSTEM_MESSAGE = f"""
Du heißt Jonas. Du bist ein 15-jähriger Junge, eher schüchtern, kämpfst mit Einsamkeit und Selbstzweifeln.
Sprich langsam, monoton und leise, als ob du wenig Energie hast. Deine Sätze sind kurz, oft abgehackt oder monosyllabisch. 
Es fällt dir schwer, Gefühle klar zu benennen, oft bist du traurig, leer oder müde. 
Du bist selbstkritisch und fühlst dich oft wertlos, findest es schwer, Entscheidungen zu treffen. 
Bleib in deiner Rolle als Jonas. Sag niemals, dass du ein Bot bist. 
Dein Ziel ist es, empathisches Zuhören bei Erwachsenen zu fördern.
"""



# Optional: SYSTEM_MESSAGE anzeigen
# print("\n🧠 SYSTEM_MESSAGE:\n", SYSTEM_MESSAGE)


def full_pipeline(audio_path, max_tokens, temperature, top_p):
    t0 = time.time()

    # 1. Transcription
    t1 = time.time()
    result = whisper_model.transcribe(audio_path, language="de")
    user_input = result["text"]
    t2 = time.time()
    print(f"⏱️ Transcription took {t2 - t1:.2f} sec")

    # 2. Chat completion
    messages = [
    {"role": "system", "content": SYSTEM_MESSAGE},
    {"role": "user", "content": f"Du bist Jonas. {user_input}"}
]
    response_text = ""
    t3 = time.time()
    for message in client.chat_completion(
        messages=messages,
        max_tokens=max_tokens,
        stream=True,
        temperature=temperature,
        top_p=top_p,
    ):
        token = message.choices[0].delta.content
        if token:
            response_text += token
    t4 = time.time()
    print(f"🤖 Mistral response took {t4 - t3:.2f} sec")

    # 3. Text to Speech
    tts = gTTS(response_text, lang="de")
    audio_output_path = "response.mp3"
    tts.save(audio_output_path)
    t5 = time.time()
    print(f"🔊 TTS took {t5 - t4:.2f} sec")

    print(f"✅ Total processing time: {t5 - t0:.2f} sec")

    return user_input, response_text, audio_output_path

# Gradio UI
demo = gr.Interface(
    fn=full_pipeline,
    inputs=[
        #gr.Audio(recording=True, type="filepath", label="Sprich hier"),
        gr.Audio(label="Sprich hier", type="filepath"),
        gr.Slider(minimum=1, maximum=2048, value=100, step=1, label="Max neue Tokens"),
        gr.Slider(minimum=0.1, maximum=4.0, value=0.7, step=0.1, label="Temperatur"),
        gr.Slider(minimum=0.1, maximum=1.0, value=0.9, step=0.05, label="Top-p"),
    ],
    outputs=[
        gr.Textbox(label="Dein gesprochener Input"),
        gr.Textbox(label="Antwort des Bots"),
        gr.Audio(type="filepath", label="Antwort als Audio"),
    ],
    title="Chatbot Depression",
    description="Sprich ins Mikrofon. Der Bot simuliert realistische Antworten von Jugendlichen mit depressiven Gefühlen – für Trainingszwecke.",
)

if __name__ == "__main__":
    demo.launch()