Download wav stream

本文关键字:stream wav Download | 更新日期: 2023-09-27 17:54:13

我正在开发一个语音识别软件,语音识别引擎的要求之一是波流。功能是识别引擎。setInputToWaveStream(流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库解决方案不适合我。

Download wav stream

看起来你正在将数据传递给MemoryStream,其中应该声明流的大小。
摘自MemoryStream()

文档

初始化MemoryStream类的新实例,使其可扩展容量初始化为0。

试试这样写:

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

已经有一段时间了,在折腾了很多之后,我已经成功地完成了这个问题所要求的,但由于存在延迟而未能将其集成到我的系统中。也许将来我能消除这种延迟。为了这个问题的目的,我将发布我的解决方案,这样其他人可能会得到帮助。:)

我尝试了很多在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文件,你可以把它输入任何你需要的东西。还有另一个问题,因为这个波文件的长度有点乱,有些类不能使用它。为了解决这个问题,你可以使用一个名为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);
            }
        } 

这应该可以解决长度问题。正如你所看到的很多工作,希望它能帮助别人!