下载 wav 流
Download wav stream
我正在开发一个语音识别软件,语音识别引擎的要求之一是波形流。函数是识别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 库解决方案对我不起作用。
看起来您正在将数据传递到应该声明流大小的 MemoryStream。
来自 MemoryStream()
上的文档
Initializes a new instance of the MemoryStream class with an expandable capacity initialized to zero.
尝试这样的事情:
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
已经有一段时间了,经过一番折腾后,我成功地完成了这个问题的要求,但由于存在延迟而未能将其集成到我的系统中。也许将来我可以摆脱这种延迟。出于这个问题的目的,我将 post 我的解决方案,以便其他人可能会得到帮助。 :)
我在 C# 中尝试了很多来录制音频流,但关键问题是在 C# 中,如果您不知道所录制内容的长度,它就会永远陷入无限循环录制。尝试了其他方法来切断这个循环,但没有用。所以我搬到 java 看看它是否能满足我的需要。在这里我成功了,我将 post 下面的 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 程序另存为 运行nable 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);
}
}
这应该可以解决长度问题。正如您所看到的很多工作,希望它对某人有所帮助!
我正在开发一个语音识别软件,语音识别引擎的要求之一是波形流。函数是识别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 库解决方案对我不起作用。
看起来您正在将数据传递到应该声明流大小的 MemoryStream。
来自 MemoryStream()
Initializes a new instance of the MemoryStream class with an expandable capacity initialized to zero.
尝试这样的事情:
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
已经有一段时间了,经过一番折腾后,我成功地完成了这个问题的要求,但由于存在延迟而未能将其集成到我的系统中。也许将来我可以摆脱这种延迟。出于这个问题的目的,我将 post 我的解决方案,以便其他人可能会得到帮助。 :)
我在 C# 中尝试了很多来录制音频流,但关键问题是在 C# 中,如果您不知道所录制内容的长度,它就会永远陷入无限循环录制。尝试了其他方法来切断这个循环,但没有用。所以我搬到 java 看看它是否能满足我的需要。在这里我成功了,我将 post 下面的 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 程序另存为 运行nable 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);
}
}
这应该可以解决长度问题。正如您所看到的很多工作,希望它对某人有所帮助!