Microsoft.CognitiveServices.Speech没有呼叫端点

时间:2019-04-12 19:29:35

标签: c# microsoft-cognitive

我正试图汇集一个概念验证项目,以了解微软的认知服务语音转录的效果如何。

我已经按照他们网站上的所有示例进行了操作,但是到目前为止都没有成功。最初,我无法使其完全在我现有的代码库之一(如x86)下运行,它引发了错误:

  

试图加载格式错误的程序

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

  

故障排除应用程序名称:dotnet.exe,版本:2.1.27415.1,时间   标记:0x5c672873故障模块名称:   Microsoft.CognitiveServices.Speech.core.dll,版本:1.3.1.28,时间   标记:0x5c764ab1异常代码:0xc0000094错误偏移量:   0x000000000007567c故障进程ID:0x6200故障应用   开始时间:0x01d4f1518c240c4b错误的应用程序路径:C:\ Program   Files \ dotnet \ dotnet.exe错误的模块路径:   C:\ Users \ username.nuget \ packages \ microsoft.cognitiveservices.speech \ 1.3.1 \ runtimes \ win-x64 \ native \ Microsoft.CognitiveServices.Speech.core.dll

最后,我发现实际上可以启动的版本1.1.0(版本1.0.0甚至不允许应用程序编译)。现在,我遇到了一个问题,即立即调用SessionStarted和SessionStopped事件,但从未发生过转录,使用Fiddler似乎没有在我的机器外部进行任何调用。

除非Cognitive Services确实存在问题,否则我肯定缺少一些简单的东西。有人可以指出吗?

我的目标是在本地网络上录制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文件丢给它,Cognitive Services就会再次崩溃,并显示异常代码:0xc0000094。我什至尝试了一半成功的代码,现在也抛出了同样的错误。

1 个答案:

答案 0 :(得分:0)

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

我通过两次转换运行文件解决了该问题。我将它们转换为.m4a文件,然后又转换回.wav文件。一旦我做完,它们都开始正常工作。

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

希望Microsoft将为Cognitive Services包装器添加更好的错误处理。并允许API处理的不仅仅是wav文件类型。