Sprache

Sprache erkennen mit Ihrem eigenen Whisper-Modell unter Verwendung von Windows ML

Important

Die Windows ML-Runtime- und Spracherkennungs-APIs sind derzeit experimentell und werden für die Verwendung in Produktionsumgebungen nicht unterstützt. Apps, die diese APIs ausprobieren, sollten nicht im Microsoft Store veröffentlicht werden.

Important

Die Windows ML-Runtime- und Spracherkennungs-APIs sind derzeit in C++ und Python verfügbar; C# wird derzeit nicht unterstützt. Lassen Sie uns wissen, ob Sie diese APIs von C# verwenden möchten, indem Sie ein Problem im Windows ML GitHub-Repository veröffentlichen!

Die Windows ML-Spracherkennungs-API vereinfacht die Ausführung der automatischen Spracherkennung (ASR) über Ihr eigenes Whisper-Modell. Er umfasst eine Whisper-Encoder-Pipeline, eine Decoderpipeline und einen Tokenizer und behandelt dann die autoregressive Transkriptionsschleife, die Streamingausgabe und den Abbruch für Sie, über der Windows ML-Runtime-API. Windows enthält kein Modell für diese API. Sie wählen, packen und verteilen das Whisper-Modell – Encoder- und Decoderdateien sowie einen Tokenizer – mit Ihrer App.

Tip

Wenn Sie kein bestimmtes Whisper-Modell oder eine benutzerdefinierte Bereitstellung benötigen und nur Speech-to-Text auf dem Gerät mit einem Modell verwenden möchten, das Microsoft verwaltet, verwenden Sie stattdessen die einsatzbereite Spracherkennungs-API.

Sie erstellen weiterhin die zugrunde liegenden Runtime-Objekte – die Encoder- und Decodermodelle, das Ausführungsziel und die Pipelines – und übergeben sie an die Sitzung. Die API blendet die Hardwareplatzierung nicht aus. es entfernt nur die Notwendigkeit, Ihre eigene Decodierungsschleife zu schreiben.

Unterstützte Modelle

Die Spracherkennungs-API wurde speziell für die Whisper-Encoder-/Decoderarchitektur erstellt – es handelt sich nicht um eine generische ASR-API. Sie stellen Folgendes zur Verfügung:

  • ONNX-Encoder- und -Decodermodelle (encoder_model.onnx und decoder_model.onnx), mit ONNX Runtime ausführen

Eine Tokenizerdatei begleitet das Encoder/Decoder-Paar. Der Eingabe-Tensor enthält Mono-Gleitkomma-PCM-Abtastwerte sowie Metadaten zur Abtastrate und zur gültigen Länge.

Transkribieren von Audio

Stellen Sie einen Runtime-Tensor bereit, der Wellenformabtastwerte enthält. Laden Sie die Whisper-Encoder- und -Decoder-Modelle, erstellen Sie jeweils eine Pipeline, und fügen Sie sie mit einem Tokenizer zu einer Sitzung zusammen:

// Create the runtime and an execution target (CPU here; GPU/NPU also available).
ComPtr<IWinMLRuntime> runtime;
THROW_IF_FAILED(WinMLCreateRuntime(IID_PPV_ARGS(runtime.GetAddressOf())));
ComPtr<IWinMLExecutionTarget> target;
THROW_IF_FAILED(runtime->CreateCpuExecutionTarget(target.GetAddressOf()));

// Load the Whisper encoder as its own single-stage pipeline.
ComPtr<IWinMLModel> encoderModel;
THROW_IF_FAILED(runtime->LoadModelFromFile(
    L"C:\\models\\whisper\\encoder_model.onnx", nullptr, encoderModel.GetAddressOf()));
ComPtr<IWinMLPipelineBuilder> encoderBuilder;
THROW_IF_FAILED(runtime->CreatePipelineBuilder(encoderBuilder.GetAddressOf()));
ComPtr<IWinMLStage> encoderStage;
THROW_IF_FAILED(encoderBuilder->AddModelStage(
    encoderModel.Get(), target.Get(), L"whisper-encoder", encoderStage.GetAddressOf()));
ComPtr<IWinMLPipeline> encoderPipeline;
THROW_IF_FAILED(encoderBuilder->Build(encoderPipeline.GetAddressOf()));

// Load the Whisper decoder the same way.
ComPtr<IWinMLModel> decoderModel;
THROW_IF_FAILED(runtime->LoadModelFromFile(
    L"C:\\models\\whisper\\decoder_model.onnx", nullptr, decoderModel.GetAddressOf()));
ComPtr<IWinMLPipelineBuilder> decoderBuilder;
THROW_IF_FAILED(runtime->CreatePipelineBuilder(decoderBuilder.GetAddressOf()));
ComPtr<IWinMLStage> decoderStage;
THROW_IF_FAILED(decoderBuilder->AddModelStage(
    decoderModel.Get(), target.Get(), L"whisper-decoder", decoderStage.GetAddressOf()));
ComPtr<IWinMLPipeline> decoderPipeline;
THROW_IF_FAILED(decoderBuilder->Build(decoderPipeline.GetAddressOf()));

ComPtr<IWinMLTokenizer> tokenizer;
THROW_IF_FAILED(WinMLCreateTokenizerFromFile(
    L"C:\\models\\whisper\\tokenizer.json", tokenizer.GetAddressOf()));

// Compose the encoder/decoder pipelines and tokenizer into a session.
const winml::tasks::speech::asr::AutomaticSpeechRecognitionArguments arguments{
    runtime.Get(),
    tokenizer.Get(),
    {
        encoderPipeline.Get(),
        encoderStage.Get(),
        decoderPipeline.Get(),
        decoderStage.Get(),
        target.Get(),
    },
};
winml::tasks::speech::asr::AutomaticSpeechRecognition speechRecognition;
THROW_IF_FAILED(winml::tasks::speech::asr::BuildAutomaticSpeechRecognition(
    arguments, speechRecognition));

Rufen Sie TranscribeWaveform auf, um einen Streamingvorgang zu starten, und rufen Sie dann Fragmente aus dem zurückgegebenen Datenstrom ab, bis der Abschluss gemeldet wird:

ComPtr<IWinMLCancellationSource> cancellation;
THROW_IF_FAILED(speechRecognition.tasks->CreateCancellationSource(
    cancellation.GetAddressOf()));

ComPtr<IWinMLAutomaticSpeechRecognitionPullStream> stream;
THROW_IF_FAILED(speechRecognition.session->TranscribeWaveform(
    waveform.Get(),
    &waveformMetadata,
    cancellation.Get(),
    stream.GetAddressOf()));

// Pull transcript text one fragment at a time until the stream completes.
WINML_AUTOMATIC_SPEECH_RECOGNITION_READ_STATUS status{};
LPCWSTR fragment = nullptr;
while (SUCCEEDED(stream->ReadNext(&status, &fragment)) &&
    status == WINML_AUTOMATIC_SPEECH_RECOGNITION_READ_STATUS_UPDATE)
{
    std::wprintf(L"%ls", fragment);
}

// The terminal result is the authoritative transcript and finish reason.
ComPtr<IWinMLAutomaticSpeechRecognitionResult> result;
THROW_IF_FAILED(stream->GetResult(result.GetAddressOf()));

waveform und waveformMetadata stammen aus Ihrem eigenen Audioladecode: ein Runtime-Tensor, der Mono-Gleitkomma-PCM-Abtastwerte enthält, sowie die Samplerate und die Metadaten mit gültiger Länge, die ihn beschreiben.

Das fertige Ergebnis enthält die vollständige Transkription und einen Abschlussgrund, z. B. ein Token für das Ende des Transkripts, ein Abbruch oder einen Fehler.

C++ und Python

Die native API wird über WinMLTasks.h und die typisierten C++-Hilfsprogramme unter winml/tasks/speech/asr/WhisperAutomaticSpeechRecognition.hpp. Python Anwendungen verwenden die windowsml.tasks Projektion zusammen mit windowsml.runtime.

Die Windows ML-Beispiele umfassen ein C++- und Python-Whisper-Transkriptionsbeispiel. Das Beispiel zeigt das vollständige Laufzeitsetup neben der Spracherkennungskonfiguration, damit Sie sehen können, wo die Abstraktion beginnt und wie Sie den zugrunde liegenden Workflow anpassen können.

Siehe auch