我正在开发语音识别软件,语音识别引擎的一个要求是波流。该函数是识别engine.setInputToWaveStream(Stream audioSource)
所以我开始研究如何使用memorystream从网页获取wave文件。这是我目前的代码。
using (WebClient webClient = new WebClient())
{
byte[] data = webClient.DownloadData(@"http://192.0.2.82:6180/audio.wav");
using (MemoryStream mem = new MemoryStream(data))
{
recEngine.SetInputToWaveStream(mem);
}
}
这不行,所以有人可以指出我正确的方向。我曾尝试查看其他资源,但其中大部分都已过时,而且NAudio库解决方案对我不起作用。
答案 0 :(得分:1)
看起来您正在将数据传递到MemoryStream中,其中应声明流的大小。
来自MemoryStream()
初始化MemoryStream类的新实例,并将可扩展容量初始化为零。
尝试这样的事情:
using (WebClient webClient = new WebClient())
{
byte[] data = webClient.DownloadData(@"http://192.0.2.82:6180/audio.wav");
using (MemoryStream mem = new MemoryStream())
{
mem.Write(data, 0 , data.Length);
recEngine.SetInputToWaveStream(mem);
}
}
根据.wav数据的格式,您还可以使用mem.WriteByte
答案 1 :(得分:0)
已经有一段时间了,经过多次搞乱之后,我已经成功地做了这个问题,但由于存在延迟而无法将其集成到我的系统中。也许在未来我将能够摆脱这种延迟。出于这个问题的目的,我将发布我的解决方案,以便其他人可能会得到帮助。 :)
我在C#中尝试了很多来录制音频流,但关键问题是在c#中,如果你不知道你录制的内容的长度,它将永远停留在无限循环录制中。试过其他方法来削减这个循环,但没有奏效。所以我转到java看看它是否可以做我需要的东西。在这里,我成功了,我将在下面发布java代码。
public class first {
public static int samplingTime = 5; //sampling time of 5 seconds
public static void main(String[]args){
try{
URLConnection conn = new URL("http://120.49.54.128:4040/audio.wav").openConnection();
InputStream is = conn.getInputStream();
OutputStream outstream = new FileOutputStream(new File("C:/Fraps/output.wav"));
byte[] buffer = new byte[4096];
int len;
long t = System.currentTimeMillis();
while ((len = is.read(buffer)) > 0 && System.currentTimeMillis() - t <= (samplingTime*1000)) {
outstream.write(buffer, 0, len);
}
outstream.close();
}
catch(Exception e){
System.out.print(e);
}
}
}
此脚本实现的目的是打开与连续音频流的连接,然后每隔5秒保存一次音频。它每5秒重写一次当前音频文件,因此您始终拥有最近5秒的音频流。您可以将此java程序保存为可运行的jar(exe),然后在需要对音频流进行采样时使用此c#代码运行它。
Process Saveprocess = new Process();
Saveprocess.StartInfo.FileName = "c:\\Fraps\\saveAudioStream.jar"; //this is the runnable jar file that you made from the java program
Saveprocess.Start();
Saveprocess.WaitForExit();
vo you you you you you you you you you w w you you you you you you you you you you you you还有另一个问题,因为这个波形文件的长度有些混乱,有些类无法使用它。要反击您可以使用名为NAudio的外部库,请将NAudio.dll添加到您的c#项目参考中,然后使用此代码段。
private void fixWaveFile(String inputPath, String outputPath)
{
using (var reader = new WaveFileReader(inputPath))
using (var converter = WaveFormatConversionStream.CreatePcmStream(reader))
{
WaveFileWriter.CreateWaveFile(outputPath, converter);
}
}
那应该解决长度问题。你可以看到很多工作,并希望它可以帮助别人!