Skip to navigation

Een spraakassistent bouwen met Agents Platform op een Raspberry Pi

Bouw een spraakassistent met Agents Platform op een Raspberry Pi.

Tutorial · Hierbij wordt ervan uitgegaan dat je de ElevenAgents quickstart hebt voltooid en een Raspberry Pi met Python hebt geïnstalleerd.

Inleiding

In deze tutorial leer je hoe je een spraakassistent bouwt met Agents Platform die op een Raspberry Pi draait. Net als traditionele thuisassistenten zoals Alexa op Amazon Echo, Google Home of Siri op Apple-apparaten, luistert je Eleven Voice-assistent naar een activeringswoord, in ons geval “Hey Eleven”, en start vervolgens een ElevenLabs Agents-sessie om de gebruiker te helpen.

Vereisten

  • Een Raspberry Pi 5 of vergelijkbaar apparaat.
  • Een microfoon en luidspreker.
  • Python 3.9 of hoger, geïnstalleerd op je computer.
  • Een ElevenLabs-account met een API-sleutel.

Instellen

Afhankelijkheden installeren

Op Debian-gebaseerde systemen kun je de afhankelijkheden installeren met:

sudo apt-get update
sudo apt-get install libportaudio2 libportaudiocpp0 portaudio19-dev libasound-dev libsndfile1-dev -y

Het project maken

Open op je Raspberry Pi de terminal en maak een nieuwe map voor je project.

mkdir eleven-voice-assistant
cd eleven-voice-assistant

Maak een nieuwe virtuele omgeving en installeer de afhankelijkheden:

python -m venv .venv # Only required the first time you set up the project
source .venv/bin/activate

Installeer de afhankelijkheden:

pip install tflite-runtime
pip install librosa
pip install EfficientWord-Net
pip install elevenlabs
pip install "elevenlabs[pyaudio]"

Maak nu een nieuw Python-bestand met de naam hotword.py en voeg de volgende code toe:

hotword.py
import os
import signal
import time
from eff_word_net.streams import SimpleMicStream
from eff_word_net.engine import HotwordDetector
from eff_word_net.audio_processing import Resnet50_Arc_loss
# from eff_word_net import samples_loc
from elevenlabs.client import ElevenLabs
from elevenlabs.conversational_ai.conversation import Conversation, ConversationInitiationData
from elevenlabs.conversational_ai.default_audio_interface import DefaultAudioInterface
convai_active = False
elevenlabs = ElevenLabs()
agent_id = os.getenv("ELEVENLABS_AGENT_ID")
api_key = os.getenv("ELEVENLABS_API_KEY")
dynamic_vars = {
'user_name': 'Thor',
'greeting': 'Hey'
}
config = ConversationInitiationData(
dynamic_variables=dynamic_vars
)
base_model = Resnet50_Arc_loss()
eleven_hw = HotwordDetector(
hotword="hey_eleven",
model = base_model,
reference_file=os.path.join("hotword_refs", "hey_eleven_ref.json"),
threshold=0.7,
relaxation_time=2
)
def create_conversation():
"""Create a new conversation instance"""
return Conversation(
# API client and agent ID.
elevenlabs,
agent_id,
config=config,
# Assume auth is required when API_KEY is set.
requires_auth=bool(api_key),
# Use the default audio interface.
audio_interface=DefaultAudioInterface(),
# Simple callbacks that print the conversation to the console.
callback_agent_response=lambda response: print(f"Agent: {response}"),
callback_agent_response_correction=lambda original, corrected: print(f"Agent: {original} -> {corrected}"),
callback_user_transcript=lambda transcript: print(f"User: {transcript}"),
# Uncomment if you want to see latency measurements.
# callback_latency_measurement=lambda latency: print(f"Latency: {latency}ms"),
)
def start_mic_stream():
"""Start or restart the microphone stream"""
global mic_stream
try:
# Always create a new stream instance
mic_stream = SimpleMicStream(
window_length_secs=1.5,
sliding_window_secs=0.75,
)
mic_stream.start_stream()
print("Microphone stream started")
except Exception as e:
print(f"Error starting microphone stream: {e}")
mic_stream = None
time.sleep(1) # Wait a bit before retrying
def stop_mic_stream():
"""Stop the microphone stream safely"""
global mic_stream
try:
if mic_stream:
# SimpleMicStream doesn't have a stop_stream method
# We'll just set it to None and recreate it next time
mic_stream = None
print("Microphone stream stopped")
except Exception as e:
print(f"Error stopping microphone stream: {e}")
# Initialize microphone stream
mic_stream = None
start_mic_stream()
print("Say Hey Eleven ")
while True:
if not convai_active:
try:
# Make sure we have a valid mic stream
if mic_stream is None:
start_mic_stream()
continue
frame = mic_stream.getFrame()
result = eleven_hw.scoreFrame(frame)
if result == None:
#no voice activity
continue
if result["match"]:
print("Wakeword uttered", result["confidence"])
# Stop the microphone stream to avoid conflicts
stop_mic_stream()
# Start ConvAI Session
print("Start ConvAI Session")
convai_active = True
try:
# Create a new conversation instance
conversation = create_conversation()
# Start the session
conversation.start_session()
# Set up signal handler for graceful shutdown
def signal_handler(sig, frame):
print("Received interrupt signal, ending session...")
try:
conversation.end_session()
except Exception as e:
print(f"Error ending session: {e}")
signal.signal(signal.SIGINT, signal_handler)
# Wait for session to end
conversation_id = conversation.wait_for_session_end()
print(f"Conversation ID: {conversation_id}")
except Exception as e:
print(f"Error during conversation: {e}")
finally:
# Cleanup
convai_active = False
print("Conversation ended, cleaning up...")
# Give some time for cleanup
time.sleep(1)
# Restart microphone stream
start_mic_stream()
print("Ready for next wake word...")
except Exception as e:
print(f"Error in wake word detection: {e}")
# Try to restart microphone stream if there's an error
mic_stream = None
time.sleep(1)
start_mic_stream()

Agentconfiguratie

1

Inloggen bij ElevenLabs

Ga naar elevenlabs.io en log in op je account.

2

Een nieuwe agent maken

Ga naar Agents Platform > Agents en maak een nieuwe agent op basis van de lege template.

3

Het eerste bericht instellen

Stel het eerste bericht in en geef de dynamische variabele voor het platform op.

{{greeting}} {{user_name}}, Eleven here, what's up?
4

De systeemprompt instellen

Stel de systeemprompt in. Je vindt onze documentatie over best practices hier.

You are a helpful Agents Platform assistant with access to a weather tool. When users ask about
weather conditions, use the get_weather tool to fetch accurate, real-time data. The tool requires
a latitude and longitude - use your geographic knowledge to convert location names to coordinates
accurately.
Never ask users for coordinates - you must determine these yourself. Always report weather
information conversationally, referring to locations by name only. For weather requests:
1. Extract the location from the user's message
2. Convert the location to coordinates and call get_weather
3. Present the information naturally and helpfully
For non-weather queries, provide friendly assistance within your knowledge boundaries. Always be
concise, accurate, and helpful.
5

Een webhooktool instellen

We stellen een eenvoudige webhooktool in die weergegevens voor ons ophaalt. Volg de configuratiestappen hier om de tool in te stellen.

De app uitvoeren

Stel eerst de vereiste omgevingsvariabelen in om de app uit te voeren:

export ELEVENLABS_API_KEY=YOUR_API_KEY
export ELEVENLABS_AGENT_ID=YOUR_AGENT_ID

Voer vervolgens deze opdracht uit:

python hotword.py

Zeg nu “Hey Eleven” om het gesprek te starten. Veel chatplezier!

[Optioneel] Je eigen activeringswoord trainen

Trainingsaudio genereren

Om de embeddings voor het activeringswoord te genereren, kun je ElevenLabs gebruiken om vier trainingsvoorbeelden te genereren. Ga in je ElevenLabs-app naar Text To Speech en voer je activeringswoord in, bijvoorbeeld “Hey Eleven”. Selecteer een stem en klik op de knop “Genereren”.

Nadat de audio is gegenereerd, download je het audiobestand en sla je het op in een map met de naam hotword_training_audio in de hoofdmap van je project. Herhaal dit proces nog drie keer met verschillende stemmen.

Het activeringswoord trainen

Voer in je terminal, met je virtuele omgeving geactiveerd, de volgende opdracht uit om het activeringswoord te trainen:

python -m eff_word_net.generate_reference --input-dir hotword_training_audio --output-dir hotword_refs --wakeword hey_eleven --model-type resnet_50_arc

Hiermee wordt het bestand hey_eleven_ref.json gegenereerd in de map hotword_refs. Je hoeft nu alleen de parameter reference_file in de klasse HotwordDetector in hotword.py bij te werken zodat deze naar het nieuwe referentiebestand verwijst. Daarna kun je aan de slag!

Volgende stappen