关于NAudio语音合成的问题,求大神解答,谢谢了
这个问题有点纠结,我之前用winform实现了,wav格式语音的获取,如下图:

语音也有声音,实现的关键代码如下:

我想了两种办法:
1、点击开始按钮,开始讲话,后台进行语音的获取,点击停止,调用停止的方法(语音获取和停止都封装在了类中),这种方法不行,点击停止,是再一次请求,之前的那个对象已经没了(我是新手,不要见怪啊),但是我再想能不能后台起一个线程,来执行这个语音获取的过程,当下次点击停止的时候,获取这个后台的线程,再进行语音录取的停止(线程方面不太懂,各位大大帮忙想个解决方案呗)。
2、点击开始按钮,点击开始按钮,开始讲话,后台进行语音的获取,这次不点击暂停,而是在获取声音后,
利用Thread.Sleep(6000) (我在想是不是这个Thread.Sleep()方法会暂停包括语音获取的所有方法,如果语音获取是另外起一个线程的话,就不会出问题了??),暂停6秒,在进行语音的暂停,代码如下,第一种方法的代码和下边的代码类似。
static CommonCode.WavaHelper wave = new CommonCode.WavaHelper();
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btnStart_Click(object sender, EventArgs e)
{
wave.waveInStream = new NAudio.Wave.WaveIn();
wave.writer = new NAudio.Wave.WaveFileWriter("C:/origin.wav", new NAudio.Wave.WaveFormat(16000, 16, 1));
wave.StartRecord("C:/origin.wav");
Thread.Sleep(6000);
wave.StopRecord();
}
protected void btnStop_Click(object sender, EventArgs e)
{
//todo: 跨线程进行访问
//if (wave != null)
//{
// wave.waveInStream.Dispose();
// wave.writer.Close();
//}
//wave.StopRecord();
最后贴出封装NAudio的类:
class Record
{
public WaveIn waveInStream;
public WaveFileWriter writer;
//public double duration = 100;
public void StartRecord(string filePath)
{
waveInStream.DataAvailable += new EventHandler<WaveInEventArgs>(waveInStream_DataAvailable);
waveInStream.RecordingStopped += new EventHandler(waveInStream_RecordingStopped);
//writer = new WaveFileWriter(filePath, waveInStream.WaveFormat);
waveInStream.StartRecording();
}
void waveInStream_RecordingStopped(object sender, EventArgs e)
{
//throw new NotImplementedException();
//todo: 跨进程访问
waveInStream.Dispose();
waveInStream = null;
writer.Close();
writer = null;
}
void waveInStream_DataAvailable(object sender, WaveInEventArgs e)
{
//throw new NotImplementedException();
writer.WriteData(e.Buffer, 0, e.BytesRecorded);
int secondsRecorded = (int)writer.Length / writer.WaveFormat.AverageBytesPerSecond;//
//if (secondsRecorded - duration>0)//可以自动停止
//{
// Console.WriteLine("完毕");
// volumeMeter.Amplitude = 0;
// StopRecord();
//}
}
public void StopRecord()
{
if (waveInStream == null)
return;
waveInStream.StopRecording();
waveInStream.Dispose();
waveInStream = null;
writer.Close();
writer = null;
Console.WriteLine("录音完毕");
}
}
即使让语音获取方法,根据获得语音的大小,自己停止(Record类中的31行),也不行。各位大神看看问题出在哪里,请原谅我的无知,我的方法不行的话,应该用什么办法来解决前台多次和后台同一个线程或过程(击我的语音获取的真个过程)进行控制呢??为什么winform下边能实现呢,很费解啊。
[解决办法]
你用asp.net来实现,将来怎么办呢?
每台要访问的机器上都要安装IIS和部署你的web应用程序吗?
[解决办法]
你的程序(包括NAudio)是要在后台IIS上运行的。
如果不在客户端安装软件,只有浏览器的话,你怎么来录音、并把语音发送到服务器呢?
[解决办法]
对的,用Silverlight或者Flash
搞明白也没有意义,这种情况只适合在IIS服务器上用浏览器访问,没什么实际用途。
建议你还是先实现Silverlight或者Flash的录音和传送部分,再看有没有问题。
[解决办法]
在 btnStart_Click中,你用 Thread.Sleep(6000);
这样表示在浏览器上点开始按钮后,要过6秒页面才会刷新,这样设计肯定是错的。
应该用 new Thread(..) 创建一个新的线程,把相关的代码全部移到这个线程里,并调用thread.Start()开始执行。
[解决办法]
我觉得你得换个思路才好。
1、NAudio这个库就是对本地电脑,你这样引用在asp.net里面,就是控制服务器的声频硬件,和客户端没有关系。
2、flash 是现有的技术,允许浏览器控制客户端的硬件,比如声频和视频。 但是给客户端的电脑带来安全问题。flash 先天致命缺陷。
3、浏览器支持 现在只有chrome 21. 相信其他的会赶上来
[解决办法]
刚查了,现在有3个浏览器支持
FIREFOX, CHROME, OPERA
http://caniuse.com/#feat=stream
[解决办法]
NAudio本身用到了WinForm的东西,它会创建从Form派生的WaveWindow,你可以按照winform的方式解决跨线程的问题。
在asp.net服务程序中调用winform的东西是很混乱的事情,搞到最后把自己都搞乱了,还是放弃吧。
[解决办法]
假如想用ASP.net的话得借用插件的技术来实现。