Automatische Erkennung gesprochener Sprache: cURL & Open Source
Erkennen Sie gesprochene Sprache direkt aus Audio mit einem mehrsprachigen Whisper-Modell, das whisper.cpp lokal bereitstellt. cURL sendet die Aufnahme an dessen HTTP-Endpunkt. Dieser liefert einen Sprachkandidaten und ein Transkript, das Sie mit der Aufnahme abgleichen können. Sobald Software und Modell heruntergeladen sind, läuft die Inferenz auf Ihrem Computer, ohne Konto oder Cloud-API.
Systemanforderungen
Verwenden Sie Linux mit Bash, einer POSIX-Shell (sh), einem C++17-Compiler,
Make, CMake, cURL, FFmpeg, Python 3 und den üblichen Befehlen tar,
gzip, dirname, grep,
mktemp und rm. Installieren Sie fehlende Werkzeuge
zuerst mit dem Paketmanager Ihrer Distribution. Python liest die JSON-Antwort ausschließlich mit
seiner Standardbibliothek.
Diese CPU-Anleitung legt whisper.cpp auf v1.8.7 fest und ist für eine
Debian-13-Umgebung mit Bash 5.2, GCC 14.2, Make 4.4, CMake 3.31, cURL 8.14, FFmpeg 7.1 und Python 3.12
konzipiert. Andere Plattformen und ältere Toolchains liegen außerhalb dieser Anleitung. Das
mehrsprachige Modell tiny belegt etwa 75 MiB auf dem Datenträger. Planen Sie
zusätzlichen Speicherplatz für Quellcode und Build sowie mehrere hundert Megabyte freien
Arbeitsspeicher für die Inferenz ein.
Installation
Laden Sie in einem neuen Arbeitsverzeichnis die festgelegte Version herunter, kompilieren Sie deren
Server und laden Sie das mehrsprachige Modell herunter. Wählen Sie tiny
statt des ausschließlich englischen Modells tiny.en. Die Klammern halten
Shell-Optionen und Verzeichniswechsel innerhalb einer Subshell:
(
set -e
for tool in curl tar gzip cmake make c++ ffmpeg python3 sh dirname grep mktemp rm; do
command -v "$tool" >/dev/null || { printf 'Missing tool: %s\n' "$tool" >&2; exit 1; }
done
if [ -e whisper-v1.8.7.tar.gz ] || [ -e whisper.cpp-1.8.7 ]; then
printf 'Use a fresh directory; existing download or source found.\n' >&2
exit 1
fi
curl -q --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 nach erfolgreicher Installation den HTTP-Server aus demselben Arbeitsverzeichnis:
(
cd whisper.cpp-1.8.7 &&
./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, dass der Server auf Verbindungen wartet, und lassen Sie dieses Terminal anschließend geöffnet. Der Beispielserver bietet keine Authentifizierung. Lassen Sie ihn deshalb 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. Verwenden Sie einen vertrauenswürdigen Ausschnitt, der mit
klarer Sprache in einer einzigen Sprache beginnt. Konvertieren Sie ihn in eine Mono-WAV-Datei mit
16 kHz und 16-Bit-PCM. Der Block weist eine vorhandene Datei audio.wav vor der
Konvertierung zurück. Zusätzlich verhindert -n, dass FFmpeg sie
überschreibt. Wählen Sie für jede Aufnahme ein neues Verzeichnis. FFmpeg 7.1 kann eine Verweigerung
des Überschreibens melden und dennoch Status null zurückgeben. Deshalb ist die explizite Prüfung
wichtig.
(
if [ -e audio.wav ]; then
printf 'Existing audio.wav; use a fresh directory.\n' >&2
exit 1
fi
ffmpeg -nostdin -n -i input.mp3 -vn -ar 16000 -ac 1 -c:a pcm_s16le audio.wav
)
Hören Sie sich audio.wav an und prüfen Sie vor dem Hochladen, ob die gewünschte
Sprache enthalten ist. FFmpeg kann Teile beschädigter Aufnahmen wiederherstellen und dennoch Erfolg
melden. Die Konvertierung allein belegt daher nicht, dass die Eingabe intakt war.
Spracherkennung
Speichern Sie dies als read_language.py neben audio.wav. Das Skript
liest die aus dem Audio abgeleitete Sprache und gibt das Transkript zur Prüfung aus. Es weist
leeren Text und Text zurück, der ausschließlich aus Markierungen in Klammern für nichtsprachliche
Laute besteht, einschließlich wiederholter Ergebnisse mit [BLANK_AUDIO]:
import json
import re
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 re.sub(r"\[[^\]]*\]", "", text).strip():
raise ValueError("No speech transcript; language result is inconclusive")
return language.strip(), " ".join(text.split())
def main():
if len(sys.argv) != 2:
raise ValueError("Usage: python3 read_language.py response.json")
language, text = read_language(sys.argv[1])
print(f"Language candidate: {language}")
print(f"Transcript: {text}")
if __name__ == "__main__":
try:
main()
except (OSError, ValueError) as error:
print(f"Cannot read language result: {error}", file=sys.stderr)
sys.exit(1)
Nachdem die Konvertierung erfolgreich abgeschlossen und das Leseskript gespeichert ist, fügen Sie diesen Anfrageblock ein. Er erstellt für jede Anfrage eine eigene temporäre Antwortdatei und liest sie nur, wenn cURL erfolgreich ist. Die Datei wird beim Abschluss des Blocks entfernt, auch bei Fehlern. So kann eine frühere Antwort nicht zum Ergebnis dieser Anfrage werden. Für die Anfrage stehen insgesamt 60 Sekunden zur Verfügung, einschließlich Upload und Inferenz. Eine ausgelastete CPU oder eine längere Aufnahme kann diese Frist überschreiten. Erhöhen Sie sie bei Bedarf bewusst.
(
set -e
response=$(mktemp ./language-response.XXXXXX)
trap 'rm -f "$response"' EXIT
curl -q --fail --silent --show-error --max-time 60 \
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 "$response" &&
python3 read_language.py "$response"
)
language=auto fordert die Spracherkennung an. Die
Antwort im Format verbose_json
des Servers enthält language und text.
Im einfachen Format json fehlt die Sprache. Die Übersetzung ist deaktiviert,
und no_language_probabilities=true überspringt einen optionalen zweiten Erkennungsdurchlauf.
Bei englischer Sprache ist Language candidate: english zu erwarten;
für Spanisch verwendet der Server den Namen spanish. Dies sind Sprachnamen,
keine ISO-Codes. Vergleichen Sie das ausgegebene Transkript mit dem, was Sie hören. Die Prüfung der
Markierungen ist nur eine Plausibilitätsprüfung:
Whisper kann Wörter erfinden,
und ein nicht leeres Transkript bestätigt weder das Vorhandensein von Sprache noch deren korrekte
Erkennung.
Leistung optimieren
Lassen Sie den Server zwischen Anfragen laufen, damit er das geladene Modell wiederverwenden kann.
tiny hält den Download für lokale Experimente klein, doch das Transkript
kann erhebliche Fehler enthalten. Prüfen Sie es anhand bekannter Aufnahmen, bevor Sie mit dem
Sprachkandidaten andere Aufgaben weiterleiten.
In dieser Version beginnt die automatische Spracherkennung bei Offset null und nutzt das Zeitfenster am Anfang der Aufnahme von etwa 30 Sekunden, statt jedes spätere Segment neu zu klassifizieren. Lange Stille am Anfang kann daher zu einer irreführenden Spracherkennung führen, selbst wenn später gesprochen wird. Verwenden Sie einen Ausschnitt, der mit Sprache beginnt. Bei Sprachwechseln bewerten Sie separate Ausschnitte. Ein Ergebnis für die gesamte Datei ist keine zeitliche Übersicht aller gesprochenen Sprachen.
Fehlerbehandlung
Wenn die Installation fehlschlägt, prüfen Sie die unvollständigen Dateien, beheben Sie die fehlende
Voraussetzung und versuchen Sie es in einem neuen Arbeitsverzeichnis erneut. Vorhandene Downloads
und entpackte Quelldateien bleiben bewusst unangetastet. Wenn die Konvertierung fehlschlägt,
prüfen Sie eine eventuell unvollständige Datei audio.wav, bevor Sie sie entfernen
oder ein anderes Verzeichnis wählen.
Bei HTTP-Fehlern, Verbindungsfehlern oder Zeitüberschreitungen beendet sich cURL mit einem Status
ungleich null. Der Anfrageblock überspringt dann das Leseskript und entfernt die temporäre Antwort.
Behalten Sie eine erfolgreich konvertierte Datei audio.wav und führen Sie nach
Behebung des Fehlers nur den Anfrageblock erneut aus. Ungültiges JSON, fehlende Felder, leere
Transkripte oder solche, die nur Markierungen enthalten, sowie nicht lesbare 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 Terminal des lokalen Servers und stellen Sie sicher, dass die WAV-Konvertierung erfolgreich war. Betrachten Sie eine bei Stille, Musik oder sehr kurzer Sprache geschätzte Sprache nicht als zuverlässige Klassifizierung.
Für gehostete Transkription in einem Dateiverarbeitungsworkflow sehen Sie sich unseren Speech Robot an.
