# hyprtile-stt

Kleines CLI-Tool für Speech-to-Text über einen lokalen oder im LAN erreichbaren `whisper.cpp`-Server.

`hyprtile-stt` kann direkt vom Mikrofon aufnehmen oder vorhandene Audio-/Videodateien transkribieren. Audio wird als 16 kHz Mono WAV vorbereitet und per HTTP Multipart an den Whisper-Server geschickt.

## Bauen

```bash
make
```

Optional installieren:

```bash
sudo make install
```

Danach ist das Tool systemweit als `hyprtile-stt` verfügbar.

## Abhängigkeiten

### Arch Linux

```bash
sudo pacman -S libpulse ffmpeg curl
```

### Debian/Ubuntu

```bash
sudo apt install libpulse-dev ffmpeg curl
```

## Mikrofon aufnehmen

Aufnahme starten:

```bash
./hyprtile-stt --mic
```

Die Aufnahme läuft, bis du `Ctrl+C` drückst. Danach wird die WAV-Datei sauber abgeschlossen, an den Server geschickt und der erkannte Text ausgegeben.

Beispiel:

```bash
./hyprtile-stt --mic
```

Mit fester Aufnahmedauer:

```bash
./hyprtile-stt --mic --duration 5
```

Das nimmt 5 Sekunden auf und schickt die Aufnahme danach automatisch an den Whisper-Server.

## Datei transkribieren

WAV-Datei transkribieren:

```bash
./hyprtile-stt --file stimme.wav
```

Video- oder Audiodatei transkribieren:

```bash
./hyprtile-stt --file video.mp4
```

Nicht-WAV-Dateien werden automatisch über `ffmpeg` nach 16 kHz Mono WAV konvertiert.

## Server setzen

Standardmäßig wird dieser Server verwendet:

```text
http://wzarch:11435/inference
```

Anderen Server verwenden:

```bash
./hyprtile-stt --mic --server http://127.0.0.1:11435/inference
```

Oder für eine Datei:

```bash
./hyprtile-stt --file stimme.wav --server http://wzarch:11435/inference
```

## Sprache setzen

Standard ist automatische Spracherkennung:

```bash
./hyprtile-stt --file stimme.wav --language auto
```

Deutsch explizit setzen:

```bash
./hyprtile-stt --file stimme.wav --language de
```

Englisch explizit setzen:

```bash
./hyprtile-stt --file stimme.wav --language en
```

## JSON statt Text ausgeben

Standardmäßig gibt `hyprtile-stt` nur das JSON-Feld `text` aus.

Komplette JSON-Antwort anzeigen:

```bash
./hyprtile-stt --file stimme.wav --json
```

## Ausgabe in Datei schreiben

Transkription in eine Datei schreiben:

```bash
./hyprtile-stt --file stimme.wav --output text.txt
```

Komplette JSON-Antwort in eine Datei schreiben:

```bash
./hyprtile-stt --file stimme.wav --json --output result.json
```

## WAV behalten

Standardmäßig werden temporäre WAV-Dateien nach der Transkription gelöscht.

Temporäre WAV behalten:

```bash
./hyprtile-stt --mic --keep-wav
```

Eigene WAV-Datei schreiben:

```bash
./hyprtile-stt --mic --wav-out aufnahme.wav
```

Bei `--wav-out` wird die angegebene Datei behalten.

## Häufige Beispiele

Kurze Mikrofonaufnahme:

```bash
./hyprtile-stt --mic --duration 3
```

Mikrofon aufnehmen bis `Ctrl+C`:

```bash
./hyprtile-stt --mic
```

WAV-Datei transkribieren:

```bash
./hyprtile-stt --file talk.wav
```

Video transkribieren:

```bash
./hyprtile-stt --file talk.mp4
```

An anderen Whisper-Server schicken:

```bash
./hyprtile-stt --file talk.wav --server http://wzarch:11435/inference
```

JSON-Rohantwort anzeigen:

```bash
./hyprtile-stt --file talk.wav --json
```

## Verhalten bei Ctrl+C

Bei Mikrofonaufnahme beendet `Ctrl+C` die Aufnahme sauber.

Das Programm:

1. stoppt die PulseAudio-Aufnahme,
2. schreibt den WAV-Header korrekt fertig,
3. sendet die Aufnahme an den Whisper-Server,
4. gibt den erkannten Text aus,
5. löscht die temporäre WAV-Datei, sofern `--keep-wav` nicht gesetzt wurde.

## Beispielausgabe

```bash
./hyprtile-stt --mic
```

```text
hyprtile-stt: recording microphone; stop with Ctrl+C
^C
hyprtile-stt: wrote /tmp/hyprtile-stt-g4fGwE.wav (2.05 sec)
Das ist ja unfassbar.
```

## Hinweise

Der Upload erfolgt per HTTP Multipart, ähnlich wie:

```bash
curl -s \
  -F "file=@stimme.wav" \
  -F "language=auto" \
  -F "response_format=json" \
  http://wzarch:11435/inference
```

Der Server sollte eine JSON-Antwort dieser Art liefern:

```json
{"text":" erkannter Text ..."}
```

`hyprtile-stt` verwendet `json.h`, um das Feld `text` sauber aus der Antwort zu lesen.
