Interactive voice-controlled dashboard for video surveillance automation.
Voice Shell Dashboard is a browser-based interface that combines:
# Start the server
sq voice-shell --port 9000
# Open in browser
http://localhost:9001
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๐ค Streamware Voice Shell โ Connected โ Ready [๐ฌ๐ง][๐ต๐ฑ][๐ฉ๐ช] [๐] โ
โโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ โ โ
โ ๐ฌ Conv โ ๐ฅ๏ธ Shell Output โ ๐ค Audio [โฎโฎ][โถ] โ
โ [โฎโฎ][โถ] โ [๐][๐๏ธ][โฎโฎ][โถ] โ [๐ค] Ready โ
โ โ โ [โน][๐][โก] โ
โโโโโโโโโโโค > track person โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ ๐ How would you... โ โ
โ โ๏ธ Proc โ > 1 โ ๐ฌ Text Input [โฎโฎ][โถ] โ
โ [โฎโฎ][โถ] โ ๐ Executing... โ [๐ค][๐ง][โน][๐] โ
โ โ ๐ EXECUTING COMMAND โ [______________][Send] โ
โ โ $ sq live narrator... โ [Yes][No][New] โ
โโโโโโโโโโโค Frame #1... โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ Frame #2... โ โ
โ [โ] โ [โ] โ ๐ Variables [โ][โฎโฎ][โถ] โ
โ โ โ url: rtsp://192.168.1.100 โ
โ โ โ email: tom@sapletta.com โ
โ โ โ language: [PL โผ] โ
โโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
| Action | Voice Command |
|---|---|
| Track person | โtrack personโ |
| Track with email | โtrack person and emailโ |
| Stop process | โstopโ |
| Check status | โstatusโ |
| Confirm | โyesโ, โokayโ, โtakโ |
| Cancel | โnoโ, โcancelโ, โnieโ |
// URL parameter
http://localhost:9001/#lang=pl
// Supported languages
EN - English (default)
PL - Polski
DE - Deutsch
All UI elements are translated:
Drag panels:
โฎโฎ button in panel headerResize panels:
โ in bottom-right cornerReset layout:
๐ Reset in headerGrid saved in URL:
http://localhost:9001/#grid=%7B%22output-panel%22%3A%7B%22col%22%3A3...%7D%7D
Conversations (idle sessions):
Processes (running commands):
Editable variables used in commands:
url - RTSP stream URLemail - Notification emailduration - Detection duration (seconds)focus - Detection target (person/car/motion)Variables auto-sync with server via WebSocket.
Track user activity via URL hash:
http://localhost:9001/#lang=pl&panel=output-panel&action=typing&session=s1
| Parameter | Description |
|---|---|
lang |
Current language |
panel |
Active panel |
action |
Current action (typing, speaking, etc.) |
session |
Current session ID |
grid |
Panel positions (JSON) |
// Voice input
{type: 'voice_input', content: 'track person'}
// Text input
{type: 'text_input', content: 'status'}
// Session management
{type: 'new_session'}
{type: 'switch_session', content: 'session_id'}
// Language change
{type: 'set_language', content: 'pl'}
// Variable change
{type: 'set_variable', content: {key: 'url', value: 'rtsp://...'}}
// TTS speak
{type: 'tts_speak', data: {text: 'How would you like...'}}
// Command executed
{type: 'command_executed', data: {command: 'sq live narrator...'}}
// Session events
{type: 'session_created', data: {session: {...}, sessions: [...]}}
{type: 'session_switched', data: {session: {...}, output: [...]}}
// Config loaded
{type: 'config_loaded', data: {language: 'pl', email: '...', url: '...'}}
# configuration.yaml
rest_command:
start_surveillance:
url: "http://localhost:9001/api/command"
method: POST
payload: '{"command": "track person and email"}'
automation:
- alias: "Start surveillance on motion"
trigger:
platform: state
entity_id: binary_sensor.motion
to: 'on'
action:
- service: rest_command.start_surveillance
[
{
"id": "websocket-voice-shell",
"type": "websocket out",
"url": "ws://localhost:9001/ws",
"msg": {"type": "text_input", "content": "track person"}
}
]
import asyncio
import websockets
import json
async def send_command(command):
async with websockets.connect('ws://localhost:9001/ws') as ws:
await ws.send(json.dumps({
'type': 'text_input',
'content': command
}))
# Listen for response
while True:
msg = await ws.recv()
data = json.loads(msg)
print(f"Event: {data['type']}")
if data['type'] == 'command_completed':
break
asyncio.run(send_command('track person'))
# Send command via HTTP (if API endpoint enabled)
curl -X POST http://localhost:9001/api/command \
-H "Content-Type: application/json" \
-d '{"command": "track person", "language": "pl"}'
| Key | Action |
|---|---|
Space |
Toggle voice recording |
Escape |
Close expanded panel |
Enter |
Send text input |
# Run all GUI tests
pytest tests/test_voice_shell_gui.py -v
pytest tests/test_voice_shell_gui_e2e.py -v
# Run specific test
pytest tests/test_voice_shell_gui_e2e.py::TestTranslator -v
MIT License - see LICENSE