> This is a page from the ElevenLabs documentation. For a complete page index, fetch https://elevenlabs.io/docs/llms.txt. For the full documentation in a single file, fetch https://elevenlabs.io/docs/llms-full.txt.

# Bygg en röstassistent med Agents Platform på en Raspberry Pi

> **Note**
>
> **Guide** · Förutsätter att du har slutfört [snabbstarten för ElevenAgents ](/docs/sv/eleven-agents/quickstart) och har en Raspberry Pi med Python installerat.

## Introduktion

I den här guiden får du lära dig att bygga en röstassistent med Agents Platform som körs på en Raspberry Pi. Precis som vanliga hemassistenter som Alexa på Amazon Echo, Google Home eller Siri på Apple-enheter lyssnar din Eleven Voice-assistent efter ett aktiveringsord, i vårt fall "Hey Eleven", och startar sedan en ElevenLabs Agents-session för att hjälpa användaren.

## Krav

* En Raspberry Pi 5 eller liknande enhet.
* En mikrofon och högtalare.
* Python 3.9 eller senare installerat på din dator.
* Ett ElevenLabs-konto med en [API-nyckel](https://elevenlabs.io/app/settings/api-keys).

## Konfiguration

### Installera beroenden

På Debian-baserade system kan du installera beroendena med:

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

### Skapa projektet

Öppna terminalen på din Raspberry Pi och skapa en ny katalog för projektet.

```bash
mkdir eleven-voice-assistant
cd eleven-voice-assistant
```

Skapa en ny virtuell miljö och installera beroendena:

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

Installera beroendena:

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

Skapa nu en ny Python-fil med namnet `hotword.py` och lägg till följande kod:

**`hotword.py`**

```python 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()
```

## Agentkonfiguration

#### Logga in på ElevenLabs

Gå till [elevenlabs.io](https://elevenlabs.io/app/sign-up) och logga in på ditt konto.

#### Skapa en ny agent

Gå till [Agents Platform > Agents](https://elevenlabs.io/app/agents/agents) och
skapa en ny agent från den tomma mallen.

#### Ange det första meddelandet

Ange det första meddelandet och specificera den dynamiska variabeln för plattformen.

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

#### Ange systemprompten

Ange systemprompten. Du hittar vår dokumentation om bästa praxis [här](/docs/sv/eleven-agents/best-practices/prompting-guide).

```txt
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.
```

#### Konfigurera ett webhook-verktyg

Vi konfigurerar ett enkelt webhook-verktyg som hämtar väderdata åt oss. Följ konfigurationsstegen [här](/docs/sv/eleven-agents/customization/tools/webhook-tools#configure-the-weather-tool) för att konfigurera verktyget.

## Kör appen

För att köra appen anger du först de nödvändiga miljövariablerna:

```bash
export ELEVENLABS_API_KEY=YOUR_API_KEY
export ELEVENLABS_AGENT_ID=YOUR_AGENT_ID
```

Kör sedan bara följande kommando:

```bash
python hotword.py
```

Säg nu "Hey Eleven" för att starta samtalet. Lycka till med pratet!

## \[Valfritt] Träna ditt egna aktiveringsord

### Generera träningsljud

För att generera inbäddningarna för aktiveringsordet kan du använda ElevenLabs för att skapa fyra träningsprover. Gå bara till [Text To Speech](https://elevenlabs.io/app/speech-synthesis/text-to-speech) i din ElevenLabs-app och skriv in ditt aktiveringsord, till exempel "Hey Eleven". Välj en röst och klicka på knappen "Generate".

När ljudet har genererats laddar du ned ljudfilen och sparar den i en mapp med namnet `hotword_training_audio` i projektets rot. Upprepa processen tre gånger till med olika röster.

### Träna aktiveringsordet

Kör följande kommando i terminalen, med den virtuella miljön aktiverad, för att träna aktiveringsordet:

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

Detta skapar filen `hey_eleven_ref.json` i mappen `hotword_refs`. Nu behöver du bara uppdatera parametern `reference_file` i klassen `HotwordDetector` i `hotword.py` så att den pekar på den nya referensfilen, sedan är du klar!

## Nästa steg

#### [ElevenAgents](/docs/sv/eleven-agents/quickstart)

Bygg en helt hanterad röstagent utan att manuellt hantera ljudströmmar.

#### [Snabbstart för TTS](/docs/sv/eleven-api/quickstart)

Utforska fler alternativ för text-till-tal och röstanpassning.