Gesprochene Sprache automatisch erkennen mit cURL & Open Source
Erkennen Sie die gesprochene Sprache direkt aus Audiodaten mit einem mehrsprachigen Whisper-Modell, das whisper.cpp lokal bereitstellt. cURL sendet die Aufnahme an dessen HTTP-Endpunkt, der die erkannte Sprache und ein Transkript zurückgibt. Sobald die Software und das Modell heruntergeladen sind, läuft die Inferenz auf Ihrem Computer ohne Konto oder Cloud-API.
Systemanforderungen
Verwenden Sie macOS oder Linux mit Bash, einem C++17-Compiler, Make, CMake 3.16 oder neuer,
cURL 7.83 oder neuer, FFmpeg und Python 3.9 oder neuer. Python liest nur die JSON-Antwort und
benötigt keine zusätzlichen Pakete. Das mehrsprachige Modell tiny
belegt etwa 75 MiB auf dem Datenträger. Planen Sie zusätzlichen Speicherplatz für den Quellcode
und den Build sowie mehrere hundert Megabyte freien Arbeitsspeicher für die Inferenz ein.
Diese Anleitung verwendet einen CPU-Build von whisper.cpp v1.8.7.
Installation
Laden Sie in einem neuen Arbeitsverzeichnis die festgelegte Version herunter, erstellen Sie den
Server und laden Sie das mehrsprachige Modell herunter. Wählen Sie tiny,
nicht das rein englischsprachige Modell tiny.en:
set -e
curl --fail --location --output whisper-v1.8.7.tar.gz \
https://github.com/ggml-org/whisper.cpp/archive/refs/tags/v1.8.7.tar.gz
tar -xzf whisper-v1.8.7.tar.gz
cd whisper.cpp-1.8.7
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release \
-DGGML_METAL=OFF -DWHISPER_BUILD_SERVER=ON
cmake --build build --config Release --target whisper-server -j 4
sh ./models/download-ggml-model.sh tiny
Transkriptionsserver einrichten
Starten Sie im entpackten Verzeichnis den HTTP-Server:
./build/bin/whisper-server --model models/ggml-tiny.bin \
--host 127.0.0.1 --port 8080 --language auto --no-gpu
Warten Sie auf die Meldung zur Empfangsbereitschaft und lassen Sie dieses Terminal anschließend geöffnet. Der Beispielserver bietet keine Authentifizierung. Lassen Sie ihn daher an die Loopback-Adresse gebunden und verwenden Sie vertrauenswürdige lokale Aufnahmen. Beenden Sie ihn nach Abschluss mit Ctrl+C.
Audio mit cURL transkribieren
Arbeiten Sie in einem zweiten Terminal in einem Verzeichnis, das eine Sprachaufnahme namens
input.mp3 enthält. Konvertieren Sie diese in eine Mono-Datei im Format
16-Bit-PCM-WAV mit 16 kHz und laden Sie sie anschließend hoch. -n
verhindert, dass FFmpeg eine vorhandene Datei audio.wav überschreibt.
Wählen Sie für jede Aufnahme ein neues Verzeichnis.
set -e
ffmpeg -nostdin -n -i input.mp3 -vn -ar 16000 -ac 1 -c:a pcm_s16le audio.wav
curl --fail --silent --show-error --remove-on-error --max-time 300 \
http://127.0.0.1:8080/inference \
--form 'file=@audio.wav;type=audio/wav' \
--form 'language=auto' \
--form 'response_format=verbose_json' \
--form 'no_language_probabilities=true' \
--output transcript.json
language=auto fordert das Spracherkennungsmodell auf, die Eingabesprache zu bestimmen.
verbose_json enthält language,
text und segments mit Zeitstempeln;
bei einfachem json fehlt das Sprachfeld.
Das Deaktivieren des optionalen Berichts zu Sprachwahrscheinlichkeiten vermeidet einen zweiten
Erkennungsdurchlauf. Die Übersetzung ist ausgeschaltet, sodass das Transkript in der erkannten
Sprache bleibt.
Spracherkennung
Speichern Sie dies als read_language.py neben transcript.json.
Das Skript validiert die bereits aus den Audiodaten ermittelte Sprache und gibt sie aus,
anstatt die Sprache anhand des Transkripts zu erraten:
import json
import sys
def read_language(path):
with open(path, encoding="utf-8") as handle:
data = json.load(handle)
if not isinstance(data, dict):
raise ValueError("Expected a JSON object")
language = data.get("language")
text = data.get("text")
if not isinstance(language, str) or not language.strip():
raise ValueError("Response has no detected language")
if not isinstance(text, str) or not text.strip():
raise ValueError("No speech transcript; language result is inconclusive")
return language
def main():
if len(sys.argv) != 2:
raise ValueError("Usage: python3 read_language.py transcript.json")
print(f"Detected language: {read_language(sys.argv[1])}")
if __name__ == "__main__":
try:
main()
except (OSError, ValueError) as error:
print(f"Cannot read language result: {error}", file=sys.stderr)
sys.exit(1)
Führen Sie nach einem erfolgreichen Upload Folgendes aus:
python3 read_language.py transcript.json
Bei englischer Sprache lautet der Sprachwert english, bei spanischer
spanish. Dies sind Sprachbezeichnungen des Servers, keine ISO-Sprachcodes.
Ein nicht leeres Transkript ist eine nützliche Plausibilitätsprüfung. Es beweist jedoch weder,
dass Sprache vorhanden war, noch, dass die erkannte Sprache korrekt ist.
Leistung optimieren
Lassen Sie den Server zwischen Anfragen laufen, damit er das geladene Modell wiederverwenden kann.
Beginnen Sie für kurze Versuche mit tiny. Die mehrsprachigen Modelle
base oder small benötigen mehr Arbeitsspeicher
und Verarbeitungszeit, können dafür aber eine höhere Genauigkeit erzielen. Laden Sie das gewählte
Modell mit demselben Download-Skript herunter und starten Sie den Server mit dem zugehörigen
Modellpfad neu.
Verwenden Sie einen klar verständlichen Ausschnitt mit mehreren Sätzen in einer Sprache. Bewerten Sie bei einer Aufnahme mit Sprachwechseln die Ausschnitte getrennt: Ein einziges Sprachergebnis für die gesamte Datei bildet nicht den zeitlichen Verlauf aller gesprochenen Sprachen ab. Erhöhen Sie das cURL-Zeitlimit gezielt, wenn längere Eingaben mehr Zeit benötigen.
Fehlerbehandlung
Der Anfrageblock bricht ab, wenn die Konvertierung oder der Upload fehlschlägt. cURL beendet sich
bei HTTP-Fehlern, Verbindungsfehlern oder Zeitüberschreitungen mit einem Exit-Code ungleich null.
--remove-on-error entfernt eine unvollständige Antwortdatei.
Führen Sie das Leseskript erst aus, wenn dieser Block erfolgreich abgeschlossen wurde.
Ungültiges JSON, fehlende Felder, ein leeres Transkript und unlesbare Dateien führen dazu,
dass sich das Leseskript mit Status 1 beendet.
Wenn der Start fehlschlägt, prüfen Sie den Modellpfad und ob Port 8080 bereits belegt ist. Wenn ein Upload fehlschlägt, prüfen Sie das lokale Serverterminal und vergewissern Sie sich, dass die WAV-Konvertierung erfolgreich war. Betrachten Sie eine bei Stille, Musik oder sehr kurzen Sprachaufnahmen vermutete Sprache nicht als zuverlässige Klassifizierung.
Tipps und bewährte Verfahren
- Prüfen Sie die Ergebnisse anhand von Aufnahmen, deren gesprochene Sprache Sie kennen, und berücksichtigen Sie dabei verschiedene Akzente.
- Bewerten Sie das Modell mit der Audioqualität Ihrer eigenen Aufnahmen, bevor Sie seine Ausgabe zur Steuerung weiterer Verarbeitungsschritte verwenden.
- Halten Sie unsichere Ergebnisse zur Überprüfung bereit, anstatt anzunehmen, dass jede Aufnahme nur eine Sprache enthält.
Für gehostete Transkription in einem Workflow zur Dateiverarbeitung nutzen Sie unseren Speech Robot.
