mirror of
https://github.com/Jeuners/astra-vision.git
synced 2026-09-09 15:02:35 +02:00
feat: add favicon, footer credits and README
Favicon aus dem Astra-Sternsymbol, GitHub- und Dillenberg.net-Link im Footer, sowie eine README mit Architektur, Setup und Sicherheitsnotizen. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LVgSHNHdRx3UNTBodFmhRA
This commit is contained in:
parent
a42b3e8d73
commit
0d75eb953c
4 changed files with 71 additions and 2 deletions
64
README.md
Normal file
64
README.md
Normal file
|
|
@ -0,0 +1,64 @@
|
||||||
|
# astra
|
||||||
|
|
||||||
|
Ein lokaler deutscher Sprachagent für Apple Silicon. Kein Cloud-Anruf, kein
|
||||||
|
Tracking, kein gespeichertes Audio — Spracherkennung, Sprachmodell und
|
||||||
|
Sprachausgabe laufen alle auf deinem Mac.
|
||||||
|
|
||||||
|
## Wie es funktioniert
|
||||||
|
|
||||||
|
Drei lokale Modelle, verbunden über eine [Pipecat](https://github.com/pipecat-ai/pipecat)-Pipeline:
|
||||||
|
|
||||||
|
| Stufe | Modell | Wo |
|
||||||
|
|---|---|---|
|
||||||
|
| Spracherkennung | Nemotron ASR (streaming) | MLX, on-device |
|
||||||
|
| Sprachmodell | Qwen 3.5 | über natives Ollama `/api/chat` |
|
||||||
|
| Sprachausgabe | Pocket TTS, Stimme „alba" | MLX, on-device |
|
||||||
|
|
||||||
|
Der Browser spricht per WebRTC direkt mit einem FastAPI-Server auf
|
||||||
|
`localhost:7860`. Der Server ist bewusst nur lokal erreichbar: Host- und
|
||||||
|
Origin-Prüfung auf jedem Request, strikte Content-Security-Policy, keine
|
||||||
|
offenen Ports nach außen.
|
||||||
|
|
||||||
|
## Starten
|
||||||
|
|
||||||
|
```bash
|
||||||
|
uv sync
|
||||||
|
uv run python -m astra.prepare # lädt & prüft alle drei Modelle einmalig
|
||||||
|
uv run python -m astra.server # startet auf http://localhost:7860
|
||||||
|
```
|
||||||
|
|
||||||
|
Ollama muss separat laufen (`ollama serve`) und `qwen3.5:latest` muss
|
||||||
|
gezogen sein. Die Seite öffnen, Mikrofon erlauben, sprechen.
|
||||||
|
|
||||||
|
## Konfiguration
|
||||||
|
|
||||||
|
Über Umgebungsvariablen, siehe `astra/core.py::Settings`:
|
||||||
|
|
||||||
|
| Variable | Default |
|
||||||
|
|---|---|
|
||||||
|
| `ASTRA_MODEL` | `qwen3.5:latest` |
|
||||||
|
| `ASTRA_OLLAMA_URL` | `http://127.0.0.1:11434` |
|
||||||
|
| `ASTRA_STT_MODEL` | `mlx-community/nemotron-3.5-asr-streaming-0.6b-8bit` |
|
||||||
|
| `ASTRA_TTS_LANGUAGE` | `german` |
|
||||||
|
| `ASTRA_VOICE` | `alba` |
|
||||||
|
| `ASTRA_PORT` | `7860` |
|
||||||
|
|
||||||
|
## Tests
|
||||||
|
|
||||||
|
```bash
|
||||||
|
uv run pytest
|
||||||
|
uv run ruff check .
|
||||||
|
```
|
||||||
|
|
||||||
|
## Sicherheit
|
||||||
|
|
||||||
|
- Nur `localhost`/`127.0.0.1` erreichbar, alle anderen Hosts bekommen 403
|
||||||
|
- POST-Requests werden gegen den erwarteten Origin geprüft
|
||||||
|
- `think` ist im Ollama-Request hart auf `false` gesetzt — die Pipeline
|
||||||
|
wirft, falls das Modell trotzdem Denkausgabe liefert
|
||||||
|
- Kein Audio, keine Transkripte werden auf Disk geschrieben; der
|
||||||
|
Gesprächsverlauf lebt nur im Speicher der laufenden Session
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Erstellt von Astra (Grunddeploy), gecheckt, dokumentiert und bewertet durch Claude.
|
||||||
4
web/favicon.svg
Normal file
4
web/favicon.svg
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
|
||||||
|
<rect width="32" height="32" rx="8" fill="#111820"/>
|
||||||
|
<text x="16" y="22" text-anchor="middle" font-size="20" fill="#b4e5cc">✳</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 207 B |
|
|
@ -5,6 +5,7 @@
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<meta name="theme-color" content="#111820">
|
<meta name="theme-color" content="#111820">
|
||||||
<title>Astra · Dein lokaler Sprachraum</title>
|
<title>Astra · Dein lokaler Sprachraum</title>
|
||||||
|
<link rel="icon" type="image/svg+xml" href="/static/favicon.svg">
|
||||||
<link rel="stylesheet" href="/static/style.css">
|
<link rel="stylesheet" href="/static/style.css">
|
||||||
<script src="/static/app.js" defer></script>
|
<script src="/static/app.js" defer></script>
|
||||||
</head>
|
</head>
|
||||||
|
|
@ -24,7 +25,7 @@
|
||||||
<div class="section-top"><h2 id="transcript-title">Unser Gespräch</h2><button id="clear" class="text-button">Verlauf leeren</button></div>
|
<div class="section-top"><h2 id="transcript-title">Unser Gespräch</h2><button id="clear" class="text-button">Verlauf leeren</button></div>
|
||||||
<div id="messages" role="log" aria-live="polite" aria-relevant="additions"><p class="empty">Hier erscheinen deine Worte und Astras Antworten.<br>Der Verlauf bleibt nur für dieses Gespräch im Speicher.</p></div>
|
<div id="messages" role="log" aria-live="polite" aria-relevant="additions"><p class="empty">Hier erscheinen deine Worte und Astras Antworten.<br>Der Verlauf bleibt nur für dieses Gespräch im Speicher.</p></div>
|
||||||
</section>
|
</section>
|
||||||
<footer><span>Deutsch <b>·</b> Lokale Spracherkennung & Stimme</span><span id="latency">Bereit für deine Gedanken</span></footer>
|
<footer><span>Deutsch <b>·</b> Lokale Spracherkennung & Stimme</span><span id="latency">Bereit für deine Gedanken</span><span class="credits"><a href="https://github.com/Jeuners/astra-local-voice" target="_blank" rel="noopener">GitHub</a><b>·</b><a href="https://www.dillenberg.net" target="_blank" rel="noopener">H.G.O.D. Dillenberg.net</a></span></footer>
|
||||||
</main>
|
</main>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
Loading…
Add table
Add a link
Reference in a new issue