12.06.2025 Speech-to-text

Vosk

Für die Anwendung mit Vosk wird zunächst ein geeignetes Modell benötigt. Auf der folgenden Seite kann aus einer Vielzahl von Sprachen und Modellgrößen gewählt werden: https://alphacephei.com/vosk/models Je größer das Modell, desto umfangreicher ist in der Regel auch der Wortschatz und die Qualität der Texterkennung.

Im Allgemeinen handelt es sich bei Vosk um ein eher leichtgewichtiges Spracherkennungstool. Es stellt geringe Anforderungen an die Hardware und ermöglicht durch die teilweise kleinen Modelle auch Einsätze auf mobilen oder Embedded-Systemen.

Anwendung

Mithilfe von model = Model("vosk-model-de-0.21") kann das gewählte Modell geladen werden. Dieser Vorgang kann etwas Zeit in Anspruch nehmen.

Neben dem Modell selbst müssen weitere Parameter wie z. B. die Abtastrate definiert werden: samplerate=16000.

Diese kann anschließend verwendet werden, um mit rec = KaldiRecognizer(model, samplerate) einen KaldiRecognizer zu erzeugen.

Um Sprache aufzunehmen, benötigt man eine Queue sowie eine Callback-Funktion, die auf Fehler prüft und die Audiodaten in die Queue legt:


q = queue.Queue()
def callback(indata, frames, time, status):
    if status:
        print(status, file=sys.stderr)
    q.put(bytes(indata))

Diese Parameter können nun verwendet werden, um eine Rohdaten-Audioaufnahme zu starten. Eine Blockgröße (blocksize) von 8000 entspricht etwa 0,5 Sekunden und ermöglicht damit eine Echtzeitverarbeitung:

with sd.RawInputStream(samplerate=samplerate, blocksize=8000, dtype='int16',
                       channels=1, callback=callback):
    print("Sprich etwas (Strg+C zum Beenden) ...")
    try:
        while True:
            data = q.get()
            if rec.AcceptWaveform(data):
                result = json.loads(rec.Result())
                print("Erkannt:", result.get("text"))
            else:
                # Zwischenstand (optional)
                # partial = json.loads(rec.PartialResult())
                pass
    except KeyboardInterrupt:
        print("\nBeendet.")

Solange das Programm nicht manuell vom Nutzer unterbrochen wird, wartet es auf neue Audiodaten in der Queue. Wird ein vollständiger Text erkannt, kann das Ergebnis weiterverarbeitet werden.

https://www.pageon.ai/blog/speech-to-text-ai

Whisper

Installation

Zunächst muss per

  • pip install -U openai-whisper

die Python Library installiert werden.

Anschließend wird noch ffmpeg benötigt (herunterladen entweder von der offiziellen Seite https://ffmpeg.org/download.html) oder einfach direkt per Paketmanager sudo apt install ffmpeg installieren.

Anwendung

Whisper unterstützt 6 Übersetzungsmodelle. Je größer, umso besser ist die Erkennungsqualität. Dafür werden aber auch mehr Ressourcen benötigt, bzw. dauert es länger.

Importieren und Laden des Modells:

import whisper

model = whisper.load_model("medium")  # z.B. small, base, medium, large

Lädt das vordefinierte Whisper-Modell. Dies dauert beim Ersten mal etwas länger.

Parameter für Audioaufnahme

samplerate = 16000
duration = 30 # Sekunden

Für Whisper wird eine Aufnahme benötigt. Im Gegensatz zu Vosk kann Whisper die Aufnahme nicht in Echtzeit verarbeiten. Stattdessen wird hier die Aufnahme zuerst beendet und dann erst die gesamte Aufnahme bearbeitet. Whisper wartet also 30 Sekunden ab (Hier kann ins Mikrofon gesprochen werden). Danach wird die Audio in Text umgewandelt.

print("Sprich etwas (Strg+C zum Beenden)...")

try:
    while True:

except KeyboardInterrupt:
    print("\nBeendet.")

Solange Strg+C nicht das Programm unterbricht, wiederholt sich folgender Vorgang: 30 Sekunden aufnehmen, bearbeiten, Ausgeben von Text.

Aufnahme

    print("Aufnahme...")
    audio = sd.rec(int(samplerate * duration), samplerate=samplerate, channels=1, dtype='float32')
    sd.wait()  # Aufnahme beenden

Mit sounddevice.rec wird 30 Sekunden lang aufgenommen.

Vorverarbeitung des Audios und Spracherkennung

    print("=> Bearbeit...") 
    audio = np.squeeze(audio)  # (samples, 1) -> (samples,)
        
    # Whisper erwartet np.float32 mit Werten in [-1,1], das passt
        
    result = model.transcribe(audio, language="de")  # Sprache Deutsch, optional

Das Modell transkripiert den gesprochenen Text. Die Sprache ist explizit als deutsch angegeben. Das Ergebnis wird in result gespeichert und dann ausgegeben: print(„Erkannt:“, result[„text“])

https://github.com/openai/whisper