我正在尝试将概念证明项目放在一起,只是为了看看微软的认知服务语音转录有多好。
我已经关注了他们网站上的所有示例,但到目前为止还没有成功。最初我无法让它在我现有的一个代码库x86下运行,它抛出了错误:
尝试加载格式不正确的程序
然后我创建了一个全新的.net框架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 \运行时\ WIN-64 \本地\ 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文件丢入其中,Cognitive Services就会再次崩溃,并显示异常代码:0xc0000094。我甚至尝试了一半工作的代码,现在也抛出同样的错误。
我发现了问题,结果证明是.wav文件本身。就像我所知,它们是有效的波形文件。如果您在Notepad ++中查看了WAV,则会在二进制文件的顶部列出WAV。但是,他们一直导致认知服务崩溃。而有一次我得到它,它无法读取它,只是开始在无限循环中运行返回空白字符串。
我通过双重转换运行文件解决了这个问题。我将它们转换为.m4a文件,然后再转换为.wav文件。一旦我这样做,他们都开始完美地工作。
我原本以为是因为我将文件远程存储在映射驱动器上。但是,一旦修复了文件,通过映射驱动器访问就可以了。
希望Microsoft能够为Cognitive Services包装器添加更好的错误处理。并允许API处理的不仅仅是wav文件类型。