Spaces:
Running
Running
import os | |
import io | |
import streamlit as st | |
from groq import Groq | |
import requests | |
import soundfile as sf | |
import google.generativeai as genai | |
from audiorecorder import audiorecorder | |
# Umgebungsvariablen laden | |
groq_api_key = os.getenv('groqwhisper') | |
gemini_api_key = os.getenv('geminiapi') | |
google_api_key = os.getenv('google_search') | |
cx="77f1602c0ff764edb" | |
if not groq_api_key or not gemini_api_key: | |
st.error("Bitte setze die Umgebungsvariablen 'groqwhisper' und 'geminiapi'") | |
st.stop() | |
# Groq Client initialisieren | |
groq_client = Groq(api_key=groq_api_key) | |
# Gemini konfigurieren | |
genai.configure(api_key=gemini_api_key) | |
# Modellkonfiguration | |
generation_config = { | |
"temperature": 0.4, | |
"top_p": 0.95, | |
"top_k": 40, | |
"max_output_tokens": 8192, | |
"response_mime_type": "text/plain", | |
} | |
model = genai.GenerativeModel( | |
model_name="gemini-2.0-flash-exp", | |
generation_config=generation_config, | |
) | |
# Session State für Chatverlauf | |
if "chat_session" not in st.session_state: | |
st.session_state.chat_session = model.start_chat(history=[]) | |
if "display_history" not in st.session_state: | |
st.session_state.display_history = [] | |
def websearch(prompt): | |
headers = { | |
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" | |
} | |
url = f"https://www.googleapis.com/customsearch/v1?key={google_api_key}&cx={cx}&q={prompt}" | |
response = requests.get(url, headers=headers) | |
data = response.json() # JSON-Daten direkt verarbeiten | |
# Extrahieren des Textes aus den Ergebnissen | |
items = data.get('items', []) | |
results = [item['snippet'] for item in items] | |
result_text = '\n'.join(results) | |
# Formuliere die Antwort | |
search_query = f"{prompt} antworte kurz und knapp. antworte auf deutsch. du findest die antwort hier: {result_text}" | |
#result = predict(search_query) | |
return result_text | |
def process_audio(audio_data): | |
"""Verarbeitet Audiodaten und gibt Transkript zurück.""" | |
try: | |
sample_rate, samples = audio_data | |
# WAV-Datei im Speicher erstellen | |
with io.BytesIO() as wav_buffer: | |
sf.write(wav_buffer, samples, sample_rate, format='WAV') | |
wav_buffer.seek(0) | |
# Transkription mit Groq | |
transcription = groq_client.audio.transcriptions.create( | |
file=("recording.wav", wav_buffer.read(), "audio/wav"), | |
model="whisper-large-v3-turbo", | |
prompt="transcribe", | |
language="de", | |
response_format="json", | |
temperature=0.0 | |
) | |
return transcription.text | |
except Exception as e: | |
return f"Fehler: {str(e)}" | |
st.subheader("Gemini-2/Websearch") | |
messages = st.container() | |
# Chatverlauf anzeigen | |
for role, text in st.session_state.display_history: | |
with st.chat_message(role): | |
st.markdown(text) | |
# Spracheingabe verarbeiten | |
audio_bytes = st.audio_input("Sprachnachricht aufnehmen") | |
if audio_bytes: | |
try: | |
audio_content = audio_bytes.getvalue() | |
with io.BytesIO(audio_content) as wav_io: | |
samples, sample_rate = sf.read(wav_io) | |
if len(samples.shape) > 1 and samples.shape[1] == 2: | |
samples = samples.mean(axis=1) | |
with st.spinner("Transkription..."): | |
transcription = process_audio((sample_rate, samples)) | |
if transcription: | |
if transcription.startswith("Fehler:"): | |
st.error(transcription) | |
else: | |
#st.session_state.display_history.append(("user", transcription)) | |
websearch = websearch(transcription) | |
full_prompt = f"{transcription}\nAntworte immer auf Deutsch\n Du findest die Antwort hier:\n{websearch}" | |
response = st.session_state.chat_session.send_message(full_prompt) | |
response_text = response.candidates[0].content.parts[0].text if response.candidates else "Keine Antwort" | |
messages.chat_message("assistant").write(f"{response_text}") | |
#st.write(response_text) | |
#st.session_state.display_history.append(("assistant", response_text)) | |
#st.rerun() | |
except Exception as e: | |
st.error(f"Audioprocessing fehlgeschlagen: {str(e)}") | |
# Texteingabe verarbeiten | |
user_input = st.text_input("Schreibe deine Frage:", key="user_input") | |
if user_input: | |
websearch = websearch(user_input) | |
#st.session_state.display_history.append(("user", user_input)) | |
full_prompt = f"{user_input}\nAntworte immer auf Deutsch\n antworte kurz und knapp.\n Du findest die Antwort hier:\n{websearch}" | |
response = st.session_state.chat_session.send_message(full_prompt) | |
response_text = response.candidates[0].content.parts[0].text if response.candidates else "Keine Antwort" | |
messages.chat_message("assistant").write(f"{response_text}") | |
#st.markdown(response_text) | |
#st.session_state.display_history.append(("assistant", response_text)) | |
#st.rerun() |