Microsoft.CognitiveServices.Speech 未调用端点

Microsoft.CognitiveServices.Speech is not calling endpoint

我正在尝试拼凑一个概念验证项目,只是想看看 Microsoft 的认知服务语音转录有多好。

我已经按照他们网站上的所有示例进行操作,但到目前为止都没有成功。最初我无法在我现有的 x86 代码库之一下将其设置为 运行,它抛出错误:

An attempt was made to load a program with an incorrect format

然后我创建了一个全新的 .net 框架 x64 控制台应用程序。它会启动,然后使用版本 1.4.0 以及我尝试过的其他几个版本在内部崩溃,并将此错误放入我的事件日志中:

Faulting application name: dotnet.exe, version: 2.1.27415.1, time stamp: 0x5c672873 Faulting module name: Microsoft.CognitiveServices.Speech.core.dll, version: 1.3.1.28, time stamp: 0x5c764ab1 Exception code: 0xc0000094 Fault offset: 0x000000000007567c Faulting process id: 0x6200 Faulting application start time: 0x01d4f1518c240c4b Faulting application path: C:\Program Files\dotnet\dotnet.exe Faulting module path: C:\Users\username.nuget\packages\microsoft.cognitiveservices.speech.3.1\runtimes\win-x64\native\Microsoft.CognitiveServices.Speech.core.dll

最后我找到了真正启动的版本 1.1.0,(版本 1.0.0 甚至不允许应用程序编译)。现在我 运行 正在解决 SessionStarted 和 SessionStopped 事件被立即调用的问题,但从未发生任何转录,并且使用 Fiddler 似乎没有在我的机器之外进行调用。

除非认知服务真的有问题,否则我肯定缺少一些简单的东西。谁能指出来?

我的目标是在本地网络上转录 5 分钟或更短的音频文件。这是我正在尝试的代码。

    static void Main(string[] args)
    {
        Console.WriteLine("Hello World!");

        var file = @"U:\path\file.wav";
        ContinuousRecognitionAsync(file).Wait();

        Console.WriteLine("End!");
    }


    public static async Task ContinuousRecognitionAsync(string audiopath)
    {
        // subscription key and service region. Replace with your own subscription key
        // and service region (e.g., "westus").
        var config = SpeechConfig.FromSubscription("<my free test key>", "westus");

        var audio = Microsoft.CognitiveServices.Speech.Audio.AudioConfig.FromWavFileInput(audiopath);


        // Creates a continuos speech recognizer using WAV input.
        using (var recognizer = new SpeechRecognizer(config, audio))
        {
            //Subscribes to events.
            recognizer.Recognizing += (s, e) =>
            {
                Console.WriteLine($"\n    Recognizing: {e.Result.Text}.");
            };

            recognizer.Recognized += (s, e) =>
            {
                Console.WriteLine($"\n    Recognized: {e.Result.Text}.");
            };
            recognizer.SessionStarted += (s, e) =>
            {
                Console.WriteLine($"\n    SessionStarted: {e.SessionId}.");
            };
            recognizer.SessionStopped += (s, e) =>
            {
                Console.WriteLine($"\n    SessionStopped: {e.SessionId}.");
            };
            recognizer.SpeechEndDetected += (s, e) =>
            {
                Console.WriteLine($"\n    SpeechEndDetected: {e.SessionId}.");
            };
            recognizer.SpeechStartDetected += (s, e) =>
            {
                Console.WriteLine($"\n    SpeechStartDetected: {e.SessionId}.");
            };
            recognizer.Canceled += (s, e) =>
            {
                Console.WriteLine($"\n    Canceled: {e.SessionId}.");
            };


            // Starts continuous recognition. Uses StopContinuousRecognitionAsync() to stop recognition.
            Console.WriteLine("Say something...");
            //await recognizer.StartContinuousRecognitionAsync().ConfigureAwait(false);
            await recognizer.StartContinuousRecognitionAsync().ConfigureAwait(false);

            Console.WriteLine("Press any key to stop");
            Console.ReadKey();

            await recognizer.StopContinuousRecognitionAsync().ConfigureAwait(false);
        }
    }

编辑:经过一些更改,并在本地移动 wav 文件(它在映射的驱动器上),它确实短暂地尝试 运行 文件上的转录,但没有返回任何有效文本,只有空白字符串。

通过麦克风转录工作正常。但是,只要我将我的一个 .wav 文件扔给它,认知服务就会再次崩溃,并显示异常代码:0xc0000094。我什至尝试了一半工作的代码,现在也抛出同样的错误。

我想通了,原来是 .wav 文件本身的问题。据我所知,它们是有效的波形文件。如果您在 Notepad++ 中查看它,则 WAV 列在二进制文件的顶部。但是,它们始终导致认知服务崩溃。有一次我拿到它,它无法读取它,只是开始 运行 无限循环返回空白字符串。

我通过双重转换 运行 文件解决了这个问题。我将它们转换为 .m4a 文件,然后再转换回 .wav 文件。一旦我这样做了,他们就开始完美地工作了。

我最初以为是因为我将文件远程存储在映射驱动器上。但是,一旦文件被修复,通过映射驱动器访问就可以正常工作了。

希望微软能为认知服务包装器添加更好的错误处理。并允许 API 处理的不仅仅是 wav 文件类型。