SSD Nodes Learn 🎉 VPS ab $5.50/Monat
Anleitungen Matt ConnorVon Matt Connor · Aktualisiert 2026-08-13

Whisper und Piper auf einem VPS selbst hosten

Betreiben Sie Whisper und Piper ohne GPU auf Ihrem VPS. Erfahren Sie, wie viel CPU-Zeit und Speicher benötigt werden und wie Sie eine OpenAI-kompatible API bereitstellen.

Self-hosted Speech-to-Text und TTS im Überblick

Self-hosted Speech-to-Text und TTS (Text-to-Speech) gehören zu den günstigsten KI-Anwendungen, die Sie auf einem eigenen Server betreiben können. Für die Transkription wird Whisper über die Laufzeitumgebung faster-whisper ausgeführt. Für die Sprachsynthese wird Piper verwendet. Beide Anwendungen laufen auf einem gewöhnlichen CPU-VPS vollständig ohne GPU. Das kleine Whisper-Modell benötigt etwa 484 MB Speicherplatz. Eine Piper-Stimme besteht aus einer einzelnen Datei mit deutlich weniger als 150 MB.

Deshalb eignet sich Audio als Einstieg. Ein Self-hosted-Bildgenerator und Self-hosted-Videogenerierung benötigen bereits eine GPU, bevor sie überhaupt sinnvoll nutzbar sind. Audio nicht.

Dieser Leitfaden behandelt beide Richtungen sowie die Verbindungsschicht dazwischen. Whisper wandelt Audio in Text um. Piper wandelt Text in Audio um. Ein OpenAI-kompatibler HTTP-Server vor beiden Diensten ermöglicht es einem vorhandenen Client, mit einer einzigen Änderung an der Base-URL auf Ihren Server zu zeigen.

Alle hier genannten Versionen waren im August 2026 aktuell.

Warum faster-whisper und nicht das Referenzpaket Whisper?

Das whisper-Paket von OpenAI führt das Modell in PyTorch aus. faster-whisper führt dieselben Modellgewichte mit CTranslate2 aus, einer speziell für Transformer-Modelle entwickelten Inferenz-Engine. Die Gewichte sind identisch. Daher ist auch das Transkript identisch. Der Unterschied liegt vollständig in der Laufzeitumgebung.

CTranslate2 quantisiert die Gewichte beim Laden. Deshalb ist compute_type="int8" ein Argument und kein separater Konvertierungsschritt. Außerdem besteht keine Abhängigkeit von PyTorch. pip install faster-whisper installiert CTranslate2, einen Tokenizer und PyAV für die Audiodekodierung. Dadurch belegt die virtuelle Umgebung einige hundert Megabyte statt mehrerer Gigabyte. Auf einem VPS mit einer 40-GB-Festplatte entscheidet dieser Unterschied darüber, ob ausreichend oder nur knapp Speicherplatz vorhanden ist.

Hier sind die vom Projekt selbst veröffentlichten Werte für das Modell small auf der CPU. Der Benchmark transkribiert 13 Minuten Audio mit 8 Threads auf einem Intel Core i7-12700K. Die Spalte x_realtime ist die Dauer von 13 Minuten geteilt durch die gemessene Laufzeit: 7.6 bedeutet, dass eine 13-minütige Aufnahme in etwas mehr als 1 Minute 40 Sekunden verarbeitet wurde.

ChartWhisper small on CPU, 13 minutes of audio (published project figures)
The data behind this chart
[
  {
    "label": "openai/whisper, fp32",
    "x_realtime": 1.9,
    "seconds": 418,
    "memory_mb": "2,335"
  },
  {
    "label": "whisper.cpp, fp32",
    "x_realtime": 6.2,
    "seconds": 125,
    "memory_mb": "1,049"
  },
  {
    "label": "faster-whisper, fp32",
    "x_realtime": 5.0,
    "seconds": 157,
    "memory_mb": "2,257"
  },
  {
    "label": "faster-whisper, int8",
    "x_realtime": 7.6,
    "seconds": 102,
    "memory_mb": "1,477"
  },
  {
    "label": "faster-whisper, int8, batch 8",
    "x_realtime": 15.3,
    "seconds": 51,
    "memory_mb": "3,608"
  }
]

Lesen Sie die zweite Zeile genau. Bei fp32 ist whisper.cpp auf dieser CPU schneller als faster-whisper: 6.2x gegenüber 5.0x. Außerdem benötigt es weniger als die Hälfte des Arbeitsspeichers. Es gehört zur selben ggml-Familie wie die llama.cpp-Seite des lokalen LLM-Stacks. faster-whisper ist schneller, sobald int8 und Batching aktiviert sind, und erreicht 15.3x. Dafür benötigt es 3,608 MB RAM. Wählen Sie daher faster-whisper für die Python-API und das Batching. Wählen Sie whisper.cpp, wenn der Arbeitsspeicher die nicht veränderbare Einschränkung ist.

Die erste Zeile ist der entscheidende Punkt dieses Abschnitts. Das Referenzpaket erreicht auf derselben Maschine 1.9x Echtzeit. Eine Stunde Audio benötigt damit eine halbe Stunde CPU-Zeit.

Wie viel Speicherplatz benötigen die Whisper-Modellgewichte?

Chartfaster-whisper model weights on disk (Systran CTranslate2 conversions, float16)
The data behind this chart
[
  {
    "label": "tiny",
    "weights_mb": 75.5
  },
  {
    "label": "base",
    "weights_mb": 145
  },
  {
    "label": "small",
    "weights_mb": 484
  },
  {
    "label": "medium",
    "weights_mb": "1,530"
  },
  {
    "label": "large-v3",
    "weights_mb": "3,090"
  }
]

Dies sind die veröffentlichten CTranslate2-Konvertierungen im Format float16. Beachten Sie, was compute_type="int8" nicht tut: Der Download wird dadurch nicht kleiner. Die Gewichte werden im Format float16 heruntergeladen, und CTranslate2 quantisiert sie beim Laden im Arbeitsspeicher. Daher belegt large-v3 auf dem Datenträger 3,090 MB, unabhängig davon, ob Sie es mit float16 oder int8 ausführen. int8 spart RAM und erhöht die Geschwindigkeit, aber nicht den Speicherplatz auf dem Datenträger.

Die Modelle werden bei der ersten Verwendung nach ~/.cache/huggingface/hub heruntergeladen. Wenn das Root-Volume einer VPS klein ist, geben Sie mit dem Argument download_root oder der Umgebungsvariablen HF_HOME einen Pfad mit ausreichend Speicherplatz an. Andernfalls ist der Datenträger beim ersten Start voll, und der Prozess bricht während des Downloads ab.

faster-whisper installieren, ohne das System-Python zu beschädigen

Ubuntu 24.04 und Debian 13 markieren das System-Python als extern verwaltet. Wenn Sie pip install faster-whisper außerhalb einer virtuellen Umgebung ausführen, wird der Vorgang sofort beendet:

error: externally-managed-environment

Das ist das Paketsystem, das die Dateien schützt, die apt verwaltet. Verwenden Sie eine virtuelle Umgebung.

sudo apt update
sudo apt install -y python3-venv ffmpeg
python3 -m venv ~/stt
~/stt/bin/pip install --upgrade pip
~/stt/bin/pip install faster-whisper==1.2.1

Version 1.2.1 ist die aktuelle Version und wurde im Oktober 2025 veröffentlicht. faster-whisper dekodiert Audiodateien über PyAV. PyAV enthält eigene ffmpeg-Bibliotheken. Dadurch kann es mp3- oder m4a-Dateien ohne separates ffmpeg-Binary lesen. Das ffmpeg-Paket oben wird später in dieser Anleitung für die Videoverarbeitung verwendet.

Prüfen Sie die Installation, bevor Sie drei Gigabyte an Gewichten herunterladen:

~/stt/bin/python -c "from faster_whisper import WhisperModel; print('ok')"

Eine Zeile mit ok bedeutet, dass die Wheels installiert wurden. Ein ImportError mit der Bezeichnung ctranslate2 bedeutet, dass das Wheel für Ihre Architektur nicht installiert wurde. Das tritt bei 32-Bit-ARM-Images auf.

Eine Besprechungsaufzeichnung oder Sprachnotiz transkribieren

Speichern Sie dies als transcribe.py:

from faster_whisper import WhisperModel

model = WhisperModel("small", device="cpu", compute_type="int8", cpu_threads=4)
segments, info = model.transcribe("meeting.m4a", beam_size=5, vad_filter=True)

print("language: %s (%.2f)" % (info.language, info.language_probability))
for segment in segments:
    print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))

Führen Sie es mit ~/stt/bin/python transcribe.py aus. Beim ersten Lauf werden die Gewichte heruntergeladen. Daher wird eine Weile nichts ausgegeben. Danach lädt das Modell innerhalb weniger Sekunden aus dem Cache.

segments ist ein Generator. Die Transkription beginnt daher erst, wenn Sie darüber iterieren. Manche messen den Aufruf von transcribe(), sehen, dass er sofort zurückkehrt, und halten das für einen Fehler. Es liegt kein Fehler vor. Die Verarbeitung erfolgt in der Schleife.

vad_filter=True führt zuerst Silero VAD (Voice Activity Detection) aus und entfernt stille Abschnitte, bevor Whisper sie verarbeitet. Bei einer Besprechungsaufzeichnung mit langen Pausen ist dies der größte einzelne Geschwindigkeitsvorteil, weil Whisper keinerlei Zeit für Audiomaterial ohne Sprache aufwendet. Außerdem werden die Schleifen mit wiederholten Sätzen unterdrückt, die Whisper erzeugt, wenn es Stille erhält und darin nach Wörtern sucht.

Setzen Sie cpu_threads auf die tatsächliche Anzahl Ihrer Kerne. Wenn Sie den Wert über die Anzahl Ihrer vCPUs setzen, wird die Transkription langsamer, weil die zusätzlichen Threads um denselben Kern konkurrieren und der Scheduler für jeden Wechsel Aufwand verursacht.

Untertitel für eine Jellyfin-Bibliothek

Jellyfin liest externe Untertiteldateien, die neben der Videodatei liegen und denselben Namen tragen. Dadurch wird Movie (2019).en.srt neben Movie (2019).mkv als englische Tonspur angezeigt, ohne Transkodierung und ohne die Bibliothek neu einzulesen.

Extrahieren Sie zuerst die Audiospur. Whisper führt intern eine Resampling-Konvertierung auf 16 kHz Mono durch. Wenn Sie die Audiospur bereits in diesem Format übergeben, vermeiden Sie auf beiden Seiten unnötige Verarbeitung:

ffmpeg -i "Movie (2019).mkv" -vn -ac 1 -ar 16000 -c:a pcm_s16le "Movie (2019).wav"

faster-whisper verfügt über keinen SRT-Writer. Formatieren Sie die Segmente daher selbst. Speichern Sie den folgenden Inhalt als srt.py:

import sys
from faster_whisper import WhisperModel

def ts(seconds):
    ms = int(round(seconds * 1000))
    hours, ms = divmod(ms, 3600000)
    minutes, ms = divmod(ms, 60000)
    secs, ms = divmod(ms, 1000)
    return "%02d:%02d:%02d,%03d" % (hours, minutes, secs, ms)

model = WhisperModel("small", device="cpu", compute_type="int8")
segments, info = model.transcribe(sys.argv[1], vad_filter=True)

with open(sys.argv[2], "w", encoding="utf-8") as out:
    for index, segment in enumerate(segments, start=1):
        out.write("%d\n" % index)
        out.write("%s --> %s\n" % (ts(segment.start), ts(segment.end)))
        out.write("%s\n\n" % segment.text.strip())

Durchlaufen Sie anschließend die Bibliothek:

for f in /srv/media/films/*.mkv; do
  ffmpeg -nostdin -y -i "$f" -vn -ac 1 -ar 16000 -c:a pcm_s16le "${f%.mkv}.wav"
  nice -n 15 ~/stt/bin/python srt.py "${f%.mkv}.wav" "${f%.mkv}.en.srt"
  rm -f "${f%.mkv}.wav"
done

-nostdin ist nicht optional. Ohne diese Option liest ffmpeg aus der Standardeingabe der Schleife. Dadurch wird der Rest der Dateiliste eingelesen, und die Schleife endet nach einem Film, ohne eine Fehlermeldung auszugeben.

Planen Sie die benötigte Zeit ein, bevor Sie beginnen. Bei dem oben genannten Wert von 7.6x benötigt ein 100-minütiger Film ungefähr 13 Minuten CPU-Zeit. Eine Bibliothek mit fünfzig Filmen läuft daher über Nacht. Auf einem gemeinsam genutzten vCPU-Tarif dauert es noch länger. Dafür ist nice vorgesehen: Die Untertitelverarbeitung läuft dann mit niedrigerer Priorität und gibt anderen Aufgaben auf dem Server Vorrang.

Text-to-Speech mit Piper

Piper ist eine neuronale Text-to-Speech-Engine, die ein ONNX-Sprachmodell auf der CPU ausführt. Zur Umwandlung von Text in Phoneme ist es in Piper eingebettet, sodass kein separater Phonemizer installiert werden muss. Die aktuelle Version ist 1.6.0 und wurde im Juli 2026 veröffentlicht.

python3 -m venv ~/tts
~/tts/bin/pip install piper-tts==1.6.0
~/tts/bin/python -m piper.download_voices en_US-lessac-medium
~/tts/bin/python -m piper -m en_US-lessac-medium -f test.wav -- 'This is a test.'

download_voices schreibt zwei Dateien in das Arbeitsverzeichnis: die .onnx-Gewichtedatei und eine .onnx.json-Konfigurationsdatei mit der Abtastrate und der Sprecherliste. Beide Dateien müssen zusammenbleiben. Wenn Sie die Stimmen in einem festen Verzeichnis speichern, übergeben Sie --data-dir an beide Befehle. Andernfalls sucht der Player im Arbeitsverzeichnis und findet eine dort nicht vorhandene Stimme nicht.

Auch das -- vor dem Text ist relevant. Ohne dieses Zeichen wird jeder Satz, der mit einem Bindestrich beginnt, als Befehlszeilenoption interpretiert.

Stimmen sind in mehreren Qualitätsstufen verfügbar. Eine englische Stimme mittlerer Qualität ist ungefähr 60 MB groß, eine Stimme hoher Qualität etwa doppelt so groß. Höhere Qualität bedeutet ein größeres Modell und mehr CPU-Zeit pro Sekunde Sprache, nicht einen anderen Sprecher.

Rufen Sie die CLI nicht in einer Schleife auf. Bei jedem Aufruf wird das Modell geladen. Bei kurzen Sätzen nimmt das Laden des Modells den größten Teil der Laufzeit ein. Starten Sie stattdessen den HTTP-Server:

~/tts/bin/pip install 'piper-tts[http]==1.6.0'
~/tts/bin/python -m piper.http_server -m en_US-lessac-medium --host 127.0.0.1 --port 5000
curl -X POST -H 'Content-Type: application/json' \
  -d '{ "text": "This is a test." }' \
  -o test.wav localhost:5000/synthesize

Wenn Sie ein test.wav abspielen können, funktioniert die Konfiguration. Dieser Endpunkt verwendet das von Piper definierte Format und nicht das Format von OpenAI. Ein Client, der /v1/audio/speech erwartet, kann daher keine Verbindung herstellen. Der nächste Abschnitt behebt dieses Problem.

Lassen Sie den Dienst mit einer Unit-Datei laufen und nicht in einem Terminal, das Sie später schließen:

[Unit]
Description=Piper text to speech HTTP server
After=network-online.target

[Service]
User=piper
ExecStart=/home/piper/tts/bin/python -m piper.http_server -m en_US-lessac-medium --data-dir /home/piper/voices --host 127.0.0.1 --port 5000
Restart=on-failure

[Install]
WantedBy=multi-user.target

sudo systemctl enable --now piper startet den Dienst und stellt ihn nach einem Reboot wieder her. Wenn der obige curl-Aufruf keine Ausgabe liefert, enthält journalctl -u piper -n 50 den Grund. Eine fehlende Sprachdatei ist die häufigste Ursache.

Die Struktur eines OpenAI-kompatiblen Servers

Die meisten Programme für die Audioverarbeitung unterstützen bereits die OpenAI Audio API: einen multipart-POST an /v1/audio/transcriptions für eine Datei und einen JSON-POST an /v1/audio/speech für einen Satz. Stellen Sie diese beiden Pfade selbst bereit. Auf Clientseite muss dann nur die Basis-URL geändert werden.

Speaches ist ein Server, der beide Richtungen unterstützt. Für die Transkription verwendet er faster-whisper und für die Sprachausgabe Piper oder Kokoro. Diese Dienste werden über die OpenAI-Pfade bereitgestellt. Die aktuelle Version ist v0.9.0-rc.3 vom Dezember 2025. Sie liegt weiterhin vor Version 1.0. Fixieren Sie daher den Image-Tag und lesen Sie vor einem Upgrade die Release Notes.

curl --silent --remote-name https://raw.githubusercontent.com/speaches-ai/speaches/master/compose.yaml
curl --silent --remote-name https://raw.githubusercontent.com/speaches-ai/speaches/master/compose.cpu.yaml
export COMPOSE_FILE=compose.cpu.yaml
docker compose up --detach

Die Variante mit einem einzelnen Container, wenn Sie keine Compose-Dateien verwalten möchten:

docker run --rm --detach --publish 8000:8000 --name speaches \
  --volume hf-hub-cache:/home/ubuntu/.cache/huggingface/hub \
  ghcr.io/speaches-ai/speaches:latest-cpu

Das benannte Volume wird häufig vergessen. Ohne dieses Volume liegt der Modell-Cache im Container. Bei jedem Neustart werden dann mehrere Gigabyte an Gewichten erneut heruntergeladen, bevor die erste Anfrage beantwortet wird.

Für die Sprachausgabe muss vor der ersten Antwort von /v1/audio/speech eine Stimme heruntergeladen werden:

uvx speaches-cli model download speaches-ai/Kokoro-82M-v1.0-ONNX

Danach funktioniert jeder OpenAI-Client, wenn Sie die Basis-URL ändern:

from pathlib import Path
from openai import OpenAI

openai = OpenAI(base_url="http://localhost:8000/v1", api_key="cant-be-empty")
res = openai.audio.speech.create(
    model="speaches-ai/Kokoro-82M-v1.0-ONNX",
    voice="af_heart",
    input="Hello, world!",
    response_format="mp3",
    speed=1,
)
with Path("output.mp3").open("wb") as f:
    f.write(res.response.read())

Der Platzhalter api_key ist erforderlich, weil die OpenAI-Clientbibliothek ohne einen solchen Wert keine Anfrage sendet. Der Server ignoriert den Wert, bis Sie einen echten Schlüssel konfigurieren.

vox-box ist ein weiteres erwähnenswertes Projekt. Es handelt sich um ein Python-Paket und nicht um einen Container. Es stellt dieselben Pfade bereit und verwendet dafür Whisper, FunASR, Bark, Dia oder CosyVoice. Die aktuelle Version ist 0.0.21 vom Dezember 2025. Sie benötigt Python 3.10 oder höher.

python3 -m venv ~/voice
~/voice/bin/pip install vox-box==0.0.21
~/voice/bin/vox-box start --huggingface-repo-id Systran/faster-whisper-small \
  --data-dir ~/voice/data --host 127.0.0.1 --port 8010

Das Beispiel des Projekts bindet Port 80, wofür root erforderlich ist. Auf einem Server, der weitere Aufgaben übernimmt, ist ein hoher Port hinter einem Reverse Proxy die bessere Variante. vox-box start akzeptiert ein Modell. Für beide Richtungen benötigen Sie daher eine zweite Instanz an einem zweiten Port mit einer Repository-ID für die Sprachausgabe.

Fragen Sie den Server ab, welches Modell er geladen hat, und verwenden Sie diese ID im Feld model:

curl http://127.0.0.1:8010/v1/models
curl http://127.0.0.1:8010/v1/audio/transcriptions \
  -H "Content-Type: multipart/form-data" \
  -F file="@voice-note.m4a" \
  -F model="faster-whisper-small"

Ein JSON-Body der Form {"text": "..."} zeigt, dass der gesamte Pfad funktioniert. Ein 404-Fehler beim Modellnamen bedeutet, dass Sie den Namen geraten haben, statt die Ausgabe von /v1/models zu lesen.

Keiner dieser Server aktiviert standardmäßig die Authentifizierung. Binden Sie sie an 127.0.0.1 und greifen Sie über ein VPN oder einen Reverse Proxy darauf zu, der Zugangsdaten verlangt. Ein offener /v1/audio/transcriptions an einer öffentlichen IP-Adresse stellt jedem, der ihn findet, kostenlose CPU-Rechenzeit bereit. Und er wird gefunden werden.

Ein Sprach-Frontend für einen selbst gehosteten Assistenten

Sobald beide Richtungen über OpenAI-Pfade antworten, kann ein Chat-Frontend sie steuern. Open WebUI und seine Alternativen akzeptieren in ihren Einstellungen eine OpenAI-kompatible Basis-URL für Audio. Dadurch kann ein einzelner Server ein lokales LLM mit Ollama ausführen und die Sprachverarbeitung in beide Richtungen schließen.

Planen Sie die Latenz realistisch ein, da diese drei Schritte auf denselben CPU-Kernen nacheinander ausgeführt werden. Die Transkription einer 10 Sekunden langen Frage dauert bei dem oben genannten Faktor von 7.6x etwa 1.3 Sekunden. Das Modell hat zu diesem Zeitpunkt noch kein einziges Token gelesen. Zusammen mit der Token-Generierung auf der CPU ist die gesamte Anfrage so langsam, dass Tester annehmen, der Dienst sei abgestürzt. Stapelverarbeitung bei der Transkription ist auf der CPU problemlos möglich. Für Gespräche gilt das nicht. An diesem Punkt beginnt sich ein VPS mit einer GPU zu rechnen.

Wann lohnt sich die GPU tatsächlich?

ChartWhisper large-v2 on an RTX 3070 Ti, 13 minutes of audio (published project figures)
The data behind this chart
[
  {
    "label": "openai/whisper, fp16",
    "x_realtime": 5.5,
    "seconds": 143,
    "memory_mb": "4,708"
  },
  {
    "label": "faster-whisper, fp16",
    "x_realtime": 12.4,
    "seconds": 63,
    "memory_mb": "4,525"
  },
  {
    "label": "faster-whisper, int8",
    "x_realtime": 13.2,
    "seconds": 59,
    "memory_mb": "2,926"
  },
  {
    "label": "faster-whisper, int8, batch 8",
    "x_realtime": 48.8,
    "seconds": 16,
    "memory_mb": "4,500"
  }
]

Auf der GPU läuft das große Modell mit int8 bei 13.2x Echtzeit innerhalb von 2,926 MB VRAM. Mit Batching steigt der Wert auf 48.8x. Beachten Sie genau, was die beiden Diagramme nicht aussagen. Sie verwenden unterschiedliche Modelle: Die GPU-Zeilen beziehen sich auf large-v2, die CPU-Zeilen auf small. Eine GPU macht das kleine Modell nicht sechsmal schneller. Sie macht das genaue Modell praktisch nutzbar.

Herkunft dieser Zahlen

Beide Diagramme geben den im faster-whisper-README veröffentlichten Benchmark wieder. Als Audio wurde eine einzelne 13-minütige Datei verwendet. Die CPU-Zeilen nutzten 8 Threads auf einem Intel Core i7-12700K. Die GPU-Zeilen nutzten CUDA 12.4 auf einer NVIDIA RTX 3070 Ti mit 8 GB VRAM. Die Spalten für Sekunden und Speicher enthalten die veröffentlichten Werte. Die Spalte x_realtime wurde daraus berechnet: 780 Sekunden Audio geteilt durch die gemessene Zeit, gerundet auf eine Dezimalstelle. Die Speicherspalte gibt im CPU-Diagramm den System-RAM und im GPU-Diagramm den VRAM an.

Ein gemeinsam genutzter vCPU-Tarif wird die CPU-Werte nicht erreichen. Der Benchmark hatte 8 Threads eines schnellen Desktop-Prozessors exklusiv zur Verfügung. Betrachten Sie 7.6x als Obergrenze. Messen Sie anschließend Ihren eigenen Rechner mit time anhand einer echten Aufnahme, bevor Sie Ihre Planung darauf stützen.

Vier Faustregeln, die sich in der Praxis bewähren:

  • Gelegentliche Transkription eigener Aufnahmen: CPU, small, int8. Zwei dedizierte vCPU reichen aus.
  • Nächtliche Batch-Verarbeitung, etwa für einen Untertitellauf: CPU, small oder medium, int8, eingebunden in nice.
  • Interaktive Anwendungen oder die Verarbeitung einer gesamten Bibliothek an einem Abend: GPU.
  • Piper: immer CPU. Ein Sprachmodell dieser Größe profitiert kaum von einer GPU.

Wenn Sie ermitteln, welche weiteren Aufgaben dieselbe Hardware übernehmen kann, behandelt die übergeordnete Frage, welche KI-Modelle Sie selbst hosten können die passenden und nicht passenden Modellgrößen.

Fehlerbilder und die dabei angezeigten Meldungen

error: externally-managed-environment bei der Installation. Das System-Python wird von der Distribution geschützt. Erstellen Sie wie oben beschrieben eine virtuelle Umgebung.

Nicht passende cuDNN-Version auf einem GPU-Host. Der Fehler sieht folgendermaßen aus:

Unable to load any of {libcudnn_ops.so.9.1.0, libcudnn_ops.so.9.1, libcudnn_ops.so.9, libcudnn_ops.so}
Invalid handle. Cannot load symbol cudnnCreateTensorDescriptor

CTranslate2 4.5.0 und spätere Versionen benötigen cuDNN 9 für CUDA 12. Auf dem Host ist jedoch cuDNN 8 installiert. Installieren Sie entweder cuDNN 9 oder pinnen Sie die ältere Laufzeit mit pip install --force-reinstall ctranslate2==4.4.0. Verwenden Sie genau eine der beiden Optionen. Wenn Sie beide ausführen, entspricht der Zustand wieder dem Ausgangszustand.

This CTranslate2 package was not compiled with CUDA support bezeichnet einen anderen Fehler mit ähnlichem Erscheinungsbild. Das installierte Wheel ist die reine CPU-Version. Erstellen Sie die virtuelle Umgebung auf dem GPU-Host neu und lassen Sie pip das Wheel erneut auswählen.

Wiederholte Phrasen im Transkript. Wenn ein Satz zehnmal wiederholt wird, wird fast immer Stille oder Musik als Sprache dekodiert. Aktivieren Sie zuerst vad_filter=True. Wenn das Problem dadurch nicht behoben wird, hören Sie sich den betreffenden Abschnitt an: Nahezu stille Audiodaten geben Whisper keinen Anhaltspunkt, und das Modell wiederholt seine letzte sichere Vermutung.

Falsche erkannte Sprache. Whisper schätzt die Sprache nur anhand der ersten 30 Sekunden. Ein info.language_probability deutlich unter 1.0 bedeutet, dass das Modell unsicher war. Das kommt vor, wenn eine Aufnahme mit Musik oder gleichzeitigem Sprechen beginnt. Verwenden Sie language="en", wenn die Sprache bereits bekannt ist.

Der Prozess gibt Killed aus und wird beendet. Das ist der Out-of-Memory-Killer des Kernels. dmesg zeigt die zugehörige oom-kill-Zeile an. large-v3 benötigt allein für die Gewichte mehr als 3 GB, bevor zusätzlicher Arbeitsspeicher berücksichtigt wird. Auf einem VPS mit 2 GB ist small mit int8 das größte passende Modell.

Piper findet die Stimme nicht. Der Player sucht im Arbeitsverzeichnis, sofern Sie nicht --data-dir übergeben. Führen Sie ls für das erwartete Verzeichnis aus und prüfen Sie, ob sowohl .onnx als auch .onnx.json vorhanden sind. Wenn eine der beiden Dateien fehlt, schlägt der Vorgang ebenso sicher fehl wie bei beiden fehlenden Dateien.

FAQ

Kann ich Sprache-zu-Text auf einer VPS nur mit CPU ausführen?

Ja, und für die Stapelverarbeitung ist das die sinnvolle Wahl. Mit faster-whisper und dem Modell small bei int8 transkribiert der veröffentlichte Benchmark des Projekts 13 Minuten Audio in 102 Sekunden auf 8 Threads eines Desktop-i7. Das entspricht etwa 7.6x Echtzeit und benötigt 1,477 MB RAM. Ein Tarif mit gemeinsam genutzter vCPU ist langsamer. Messen Sie daher Ihr eigenes System. Text-to-Speech mit Piper ist noch einfacher und benötigt unter keinen Umständen eine GPU.

Welche Whisper-Modellgröße sollte ich verwenden?

Beginnen Sie mit small bei int8. Das Modell belegt 484 MB auf der Festplatte und verarbeitet klar aufgezeichnete Sprache zuverlässig. Wechseln Sie zu medium, wenn Akzente oder Hintergrundgeräusche Fehler verursachen, die Sie nicht akzeptieren können. Verwenden Sie large-v3 nur, wenn Genauigkeit wichtiger ist als alles andere. Dieses Modell benötigt 3,090 MB Speicherplatz und mehr als 3 GB Arbeitsspeicher. tiny mit 75.5 MB eignet sich dagegen zur Spracherkennung und zum Testen einer Pipeline, nicht für Transkripte, die eine Person lesen soll.

Warum ist faster-whisper schneller als das ursprüngliche Whisper-Paket?

Das Modell ist identisch. Die Laufzeitumgebung ist es nicht. Das Referenzpaket führt Whisper in PyTorch aus. faster-whisper verwendet dieselben Gewichte mit CTranslate2, einer für die Transformer-Inferenz entwickelten Engine. Sie quantisiert die Gewichte beim Laden und benötigt keine PyTorch-Installation. Im veröffentlichten CPU-Benchmark erreicht das Referenzpaket 1.9x Echtzeit. faster-whisper erreicht bei int8 7.6x Echtzeit und benötigt weniger Speicher.

Warum wiederholt mein Transkript immer wieder denselben Satz?

Whisper interpretiert Stille oder Musik als Sprache und verwendet wiederholt seine letzte sichere Schätzung. Setzen Sie vad_filter=True im Aufruf von transcribe(). Dadurch wird zuerst die Silero-Spracherkennung ausgeführt und die stillen Abschnitte werden entfernt, bevor das Modell sie verarbeitet. Wenn die Wiederholungen weiterhin auftreten, prüfen Sie den Audiopegel. Eine Aufnahme, die fast vollständig stumm ist, liefert dem Modell keine verwertbaren Informationen.

Wie erhalte ich einen OpenAI-kompatiblen Audio-Endpunkt auf meinem eigenen Server?

Führen Sie einen Server aus, der POST /v1/audio/transcriptions und POST /v1/audio/speech implementiert. Verweisen Sie den Client anschließend mit einer neuen Basis-URL darauf. Speaches ist eine Möglichkeit. Es wird als Container-Image mit CPU-Build veröffentlicht und verwendet faster-whisper für die Transkription sowie Piper oder Kokoro für die Sprachsynthese. vox-box ist eine weitere Möglichkeit. Installieren Sie es mit pip install vox-box und starten Sie es mit vox-box start --huggingface-repo-id. Pro Prozess wird ein Modell bereitgestellt. Beide Lösungen aktivieren standardmäßig keine Authentifizierung. Binden Sie den Dienst daher an localhost und schalten Sie einen Proxy oder ein VPN davor.

#whisper#tts#piper#speech-to-text#self-hosted-ai