Idioma

Reconheça a fala com o seu próprio modelo Whisper usando Windows ML

Importante

As APIs de Runtime e Reconhecimento de Fala do Windows ML são atualmente experimentais e não são suportadas para utilização em ambientes de produção. Os aplicativos que experimentam essas APIs não devem ser publicados na Microsoft Store.

Importante

As APIs de Runtime e Reconhecimento de Voz do Windows ML estão atualmente disponíveis em C++ e Python; O C# não é atualmente suportado. Diga-nos se estiver interessado em usar estas APIs do C# abrindo um issue no repositório GitHub do Windows ML!

A API de Reconhecimento de Fala do Windows ML simplifica a execução do reconhecimento automático de voz (ASR) com o seu próprio modelo Whisper. Compõe um pipeline codificador Whisper, um pipeline de descodificador e um tokenizador, depois gere o ciclo de transcrição autorregressivo, a saída em streaming e o cancelamento por si, sobre a Windows ML Runtime API. O Windows não fornece um modelo para esta API; escolhe, empacota e distribui o modelo Whisper — ficheiros codificadores e descodificadores, mais um tokenizador — com a sua aplicação.

Tip

Se não precisar de um modelo Whisper específico ou de uma implementação personalizada e apenas quiser conversão de fala em texto no dispositivo com um modelo que a Microsoft gere, use antes a API de Reconhecimento de Fala pronta a usar.

Ainda crias os objetos de Runtime subjacentes — os modelos codificador e descodificador, o alvo de execução e os pipelines — e passa-os para a sessão. A API não esconde a colocação do hardware; apenas elimina a necessidade de escrever o seu próprio loop de decodificação.

Modelos suportados

A API de Reconhecimento de Fala foi construída especificamente para a arquitetura codificador/descodificador Whisper — não é uma API ASR genérica. O utilizador fornece:

  • modelos de codificador e descodificador ONNX (encoder_model.onnx e decoder_model.onnx), executados através do ONNX Runtime

Um ficheiro tokenizador acompanha o par codificador/decodificador. O tensor de entrada contém amostras PCM mono em ponto flutuante, além de metadados de taxa de amostragem e comprimento válido.

Transcrever áudio

Fornece um tensor Runtime que contém amostras de forma de onda. Carregue os modelos de codificador e decodificador do Whisper, construa um pipeline para cada um e componha-os com um tokenizador numa sessão:

// 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));

Chame TranscribeWaveform para iniciar uma operação de streaming, depois retire fragmentos do fluxo devolvido até que reporte a conclusão:

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 e waveformMetadata vêm do seu próprio código de carregamento de áudio: um tensor Runtime que contém amostras PCM mono em ponto flutuante, além da taxa de amostragem e dos metadados de comprimento válido que o descrevem.

O resultado concluído reporta a transcrição completa e uma razão de finalização, como um token de fim de transcrição, cancelamento ou um erro.

C++ e Python

A API nativa é exposta através de WinMLTasks.h e os auxiliares C++ tipados em winml/tasks/speech/asr/WhisperAutomaticSpeechRecognition.hpp. As aplicações Python utilizam a windowsml.tasks projeção juntamente com windowsml.runtime.

Os exemplos de Windows ML incluem um exemplo de transcrição Whisper em C++ e Python. O exemplo mostra a configuração completa do Runtime ao lado da configuração de reconhecimento de voz, para que possas ver onde começa a abstração e como personalizar o fluxo de trabalho subjacente.

Ver também