我正在开发一个语音识别软件,对语音识别引擎的要求之一是一个波流。它的功能是识别engine.setInputToWaveStream(Stream audioSource)
因此,我已经开始研究如何使用内存流从网页中获取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库解决方案对我不起作用。
发布于 2015-06-07 21:11:30
看起来,您正在将数据传递到应该声明流大小的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
发布于 2015-06-12 16:18:15
已经有一段时间了,在混乱了很多之后,我成功地完成了这个问题所要求的事情,但由于存在延迟,我未能将它集成到我的系统中。也许在未来,我将能够摆脱这个延迟。为了这个问题的目的,我将张贴我的解决方案,以便其他人可能得到帮助。:)
我在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(); 瞧,你有一个wav文件,你的硬风险,你可以把它投入到任何你需要。但是还有另一个问题,因为这个wave文件的长度有点混乱,有些类不能使用它。要避免可以使用名为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);
}
} 这应该能解决长度问题。因为你可以看到很多的工作,并希望它能帮助别人!
https://stackoverflow.com/questions/30698128
复制相似问题