首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

关于NAudio语音合成的有关问题,求大神解答,多谢了

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

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

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


关于NAudio语音合成的有关问题,求大神解答,多谢了

我想了两种办法:
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()开始执行。

[解决办法]
引用:
这个问题有点纠结,我之前用winform实现了,wav格式语音的获取,如下图:



语音也有声音,实现的关键代码如下:
C# code?12345678910111213141516171819202122          protected void btnStart_Click(object sender, EventArgs e)        {  ……

我觉得你得换个思路才好。
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的话得借用插件的技术来实现。

热点排行