Interaktives Ausstellungs-Setup – Mac Mini + Physischer Knopf + ElevenLabs
Plug & Play USB-Button. Wird als HID-Keyboard erkannt (meist als "Enter" oder "F12"). Einfachste Lösung, kein Arduino nötig. Oft als "Panic Button" verkauft.
USB-Fußpedal – gleiches Prinzip wie der Button, aber stabiler und oft günstiger. Wird auch als HID-Keyboard erkannt. Für Ausstellung evtl. interessant: "Tritt auf den Knopf".
Profi-Lösung mit echtem Arcade-Feeling. Arduino Pro Micro emuliert Keyboard. Kann mit LED-Ring erweitert werden. Anspruchsvoller, aber stylischer.
Budget-Alternative. Funk-Präsentations-Clicker, aber funktioniert auch. Weniger "Ausstellungs-Wow-Effekt".
# voice_button.py
import keyboard
import sounddevice as sd
import numpy as np
import wavio
import openai
import requests
from elevenlabs import generate, stream, set_api_key
import os
from datetime import datetime
# API Keys
openai.api_key = os.getenv("OPENAI_API_KEY")
set_api_key(os.getenv("ELEVENLABS_API_KEY"))
# Config
SAMPLE_RATE = 16000
RECORDING = False
audio_buffer = []
def record_callback(indata, frames, time, status):
global audio_buffer
if RECORDING:
audio_buffer.append(indata.copy())
def start_recording():
global RECORDING, audio_buffer
print("🔴 Aufnahme startet...")
RECORDING = True
audio_buffer = []
# LED einschalten (falls vorhanden)
def stop_recording():
global RECORDING
RECORDING = False
print("⏹️ Aufnahme stoppt...")
# Audio speichern
if audio_buffer:
audio = np.concatenate(audio_buffer, axis=0)
filename = f"recording_{datetime.now().strftime('%Y%m%d_%H%M%S')}.wav"
wavio.write(filename, audio, SAMPLE_RATE, sampwidth=2)
# Verarbeitung
process_audio(filename)
def process_audio(filename):
# 1. Transkription
with open(filename, "rb") as audio_file:
transcript = openai.audio.transcriptions.create(
model="whisper-1",
file=audio_file
)
print(f"📝 Gesagt: {transcript.text}")
# 2. LLM Antwort
response = openai.chat.completions.create(
model="gpt-4",
messages=[
{"role": "system", "content": "Du bist ein freundlicher Ausstellungs-Guide. Antworte kurz und prägnant auf Deutsch."},
{"role": "user", "content": transcript.text}
]
)
answer = response.choices[0].message.content
print(f"🤖 Antwort: {answer}")
# 3. ElevenLabs TTS (Streaming)
audio_stream = generate(
text=answer,
voice="Scarlett", # oder: "Adam", "Bella", "Antoni"
model="eleven_turbo_v2",
stream=True
)
stream(audio_stream)
print("✅ Fertig!")
# Keyboard Listener
def on_space_press(e):
if e.event_type == 'down' and not RECORDING:
start_recording()
elif e.event_type == 'up' and RECORDING:
stop_recording()
print("🎙️ Voice Button bereit. Drück Space...")
keyboard.hook_key('space', on_space_press)
keyboard.wait()
| Komponente | Kosten |
|---|---|
| Dream Cheeky Button | ~40 CHF |
| OpenAI Whisper | ~$0.006/min |
| Claude GPT-4 | ~$0.03/Anfrage |
| ElevenLabs | ~$5/1000 Zeichen |
| Pro 100 Interaktionen | ~$10-15 |
# 1. Python Dependencies
pip install openai elevenlabs sounddevice wavio numpy keyboard
# 2. ElevenLabs API Key holen
# → https://elevenlabs.io/app/settings/api-keys
# 3. OpenAI API Key holen
# → https://platform.openai.com/api-keys
# 4. Environment Variables setzen
export OPENAI_API_KEY="sk-..."
export ELEVENLABS_API_KEY="..."
# 5. App starten
python voice_button.py
Für echten "Live-Gespräch"-Modus statt Knopf-Drücken:
Das ist komplexer, aber fühlt sich an wie ChatGPT Voice.
Räffelstrasse 26
8045 Zürich
Schweiz (CH)