我正试图汇集一个概念验证项目,以了解微软的认知服务语音转录的效果如何。
我已经按照他们网站上的所有示例进行了操作,但是到目前为止都没有成功。最初,我无法使其完全在我现有的代码库之一(如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。我什至尝试了一半成功的代码,现在也抛出了同样的错误。
答案 0 :(得分:0)
我发现了问题,原来是.wav文件本身。据我所知,它们是有效的波形文件。如果您在Notepad ++中查看过,则WAV列在二进制文件的顶部。但是,它们始终导致认知服务崩溃。有一次我拿走它,它无法读取它,只是开始在无限循环中运行,返回空白字符串。
我通过两次转换运行文件解决了该问题。我将它们转换为.m4a文件,然后又转换回.wav文件。一旦我做完,它们都开始正常工作。
我最初以为是因为我将文件远程存储在映射的驱动器上。但是,一旦文件修复,通过映射驱动器的访问就可以正常工作。
希望Microsoft将为Cognitive Services包装器添加更好的错误处理。并允许API处理的不仅仅是wav文件类型。