Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 8 additions & 9 deletions docs/assistant_server_contract.md
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ The user simulator always connects to `ws://localhost:{port}/ws`, so both `/ws`

The user simulator sends and receives audio in the
[Twilio Media Streams](https://www.twilio.com/docs/voice/media-streams) format: JSON
envelopes over WebSocket. Helper functions in `audio_bridge.py` handle all encoding
envelopes over WebSocket. Helper functions in `utils/audio_utils.py` handle all encoding
and decoding.

### Incoming messages from the simulator
Expand All @@ -136,7 +136,7 @@ events.
### Sending audio back to the simulator

```python
from eva.assistant.audio_bridge import create_twilio_media_message
from eva.utils.audio_utils import create_twilio_media_message
msg = create_twilio_media_message(stream_sid, mulaw_chunk)
await websocket.send_text(msg)
```
Expand All @@ -147,7 +147,7 @@ dedicated `_pace_audio_output` asyncio task to drain a queue at this rate — co
pattern. If audio is sent too fast or too slow, the user simulator's may incorrectly detect
turn boundaries.

### Audio conversion utilities (`audio_bridge.py`)
### Audio conversion utilities (`utils/audio_utils.py`)

| Function | Converts |
|---|---|
Expand All @@ -172,7 +172,7 @@ resulting mixed WAV will have the audio offset by Δ. Before extending either bu
pad the *other* buffer to the same position:

```python
from eva.assistant.audio_bridge import sync_buffer_to_position
from eva.utils.audio_utils import sync_buffer_to_position

# When user audio arrives and the model is not speaking:
if not model_is_speaking:
Expand Down Expand Up @@ -381,17 +381,16 @@ from pathlib import Path
import uvicorn
from fastapi import FastAPI, WebSocket

from eva.assistant.audio_bridge import (
FrameworkLogWriter,
MetricsLogWriter,
from eva.assistant.base_server import INITIAL_MESSAGE, AbstractAssistantServer
from eva.assistant.pipeline.observers import FrameworkLogWriter, MetricsLogWriter
from eva.models.config import ModelConfig
from eva.utils.audio_utils import (
create_twilio_media_message,
mulaw_8k_to_pcm16_24k,
parse_twilio_media_message,
pcm16_24k_to_mulaw_8k,
sync_buffer_to_position,
)
from eva.assistant.base_server import INITIAL_MESSAGE, AbstractAssistantServer
from eva.models.config import ModelConfig


class MyFrameworkAssistantServer(AbstractAssistantServer):
Expand Down
261 changes: 0 additions & 261 deletions src/eva/assistant/audio_bridge.py

This file was deleted.

8 changes: 2 additions & 6 deletions src/eva/assistant/base_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@
from fastapi import FastAPI

from eva.assistant.agentic.audit_log import AuditLog
from eva.assistant.audio_bridge import FrameworkLogWriter, MetricsLogWriter
from eva.assistant.pipeline.observers import FrameworkLogWriter, MetricsLogWriter
from eva.assistant.tools.tool_executor import ToolExecutor
from eva.models.agents import AgentConfig
from eva.models.config import ModelConfig
from eva.utils.audio_utils import save_pcm_as_wav
from eva.utils.audio_utils import pcm16_mix, save_pcm_as_wav
from eva.utils.culture import get_initial_message
from eva.utils.logging import get_logger
from eva.utils.prompt_manager import PromptManager
Expand Down Expand Up @@ -166,8 +166,6 @@ async def stop(self) -> asyncio.Task | None:
f"assistant={len(self.assistant_audio_buffer)} "
f"diff={diff_ms:.0f}ms — mixed recording may be temporally skewed"
)
from eva.assistant.audio_bridge import pcm16_mix # lazy: avoids circular import at module load

self._audio_buffer = bytearray(
pcm16_mix(bytes(self.user_audio_buffer), bytes(self.assistant_audio_buffer))
)
Expand Down Expand Up @@ -291,8 +289,6 @@ def _save_audio(self) -> None:
f"assistant={len(self.assistant_audio_buffer)} "
f"diff={diff_ms:.0f}ms — mixed recording may be temporally skewed"
)
from eva.assistant.audio_bridge import pcm16_mix

self._audio_buffer = bytearray(pcm16_mix(bytes(self.user_audio_buffer), bytes(self.assistant_audio_buffer)))
elif not self._audio_buffer and self.user_audio_buffer:
self._audio_buffer = bytearray(self.user_audio_buffer)
Expand Down
13 changes: 6 additions & 7 deletions src/eva/assistant/elevenlabs_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,17 +33,16 @@
)
from fastapi import FastAPI, WebSocket, WebSocketDisconnect

from eva.assistant.audio_bridge import (
FrameworkLogWriter,
MetricsLogWriter,
create_twilio_media_message,
mulaw_8k_to_pcm16_16k,
parse_twilio_media_message,
)
from eva.assistant.base_server import AbstractAssistantServer
from eva.assistant.elevenlabs_audio_interface import TwilioAudioBridge
from eva.assistant.pipeline.observers import FrameworkLogWriter, MetricsLogWriter
from eva.models.agents import AgentConfig
from eva.models.config import ModelConfig
from eva.utils.audio_utils import (
create_twilio_media_message,
mulaw_8k_to_pcm16_16k,
parse_twilio_media_message,
)
from eva.utils.logging import get_logger

logger = get_logger(__name__)
Expand Down
Loading
Loading