Microsoft.CognitiveServices.Speech не вызывает конечную точку - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь собрать концептуальный проект, просто чтобы посмотреть, насколько хороша речевая транскрипция Microsoft Cognitive Services.

Я следовал всем примерам на их сайте, но пока безуспешно. Первоначально я не смог заставить его работать под одной из моих существующих баз кода под 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 Идентификатор ошибочного процесса: 0x6200 Ошибочное приложение время начала: 0x01d4f1518c240c4b Неверный путь к приложению: C: \ Program Files \ dotnet \ dotnet.exe Неверный путь к модулю: C: \ Users \ username.nuget \ пакеты \ microsoft.cognitiveservices.speech \ 1.3.1 \ автономной работы \ обоюдного x64 \ родной \ 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 голосов
/ 16 апреля 2019

Я разобрался с проблемой, оказалось, сами файлы .wav. Насколько я мог судить, они были действительными волновыми файлами. С WAV, перечисленным в верхней части двоичного файла, если вы смотрели на него в Notepad ++. Однако они постоянно вызывали сбой Cognitive Services. И как только я получил его, он не смог прочитать его и просто начал работать в бесконечном цикле, возвращая пустые строки.

Я решил проблему, запустив файлы через двойное преобразование. Я преобразовал их в файлы .m4a, а затем обратно в файлы .wav. Как только я это сделал, все начали работать отлично.

Первоначально я думал, что это потому, что я хранил файлы удаленно на подключенном диске. Однако после исправления файлов доступ через подключенный диск работал нормально.

Надеюсь, Microsoft добавит лучшую обработку ошибок в оболочку Cognitive Services. И позволяют API обрабатывать больше, чем просто типы файлов WAV.

...