用.net开发音频编辑软件

      智能语音机器人软件免不了需要对语音流进行处理,主要包括语音的播放、录制、读取、保存、图形化展示和剪辑等功能。这方面专业的软件有Adobe Audition,为了方便用户使用,我用.net实现了上述功能。

由于这些功能相对比较独立,我顺便做了一个工具软件,如下图所示。

 

 

      本软件适用的音频文件格式是wav、单声道、8000采样率、16比特。

      在这里介绍一下开发这个软件过程几个有意思的点:

一、音频分段表示

      将音频文件的数据部分用List<byte[]>进行分段。

     FrameData = new List<byte[]>();

                byte[] buffer = new byte[320];

                int readedCount = 0;

                i = 0;

                readedCount = fileStream.Read(buffer, 0, buffer.Length);

                while (readedCount > 0)

                {

                    ++i;

                    FrameData.Add(buffer);

                    buffer = new byte[320];

                    readedCount = fileStream.Read(buffer, 0, buffer.Length);

       }

      当播放音频文件时,根据传输速率每20毫秒向SecondaryBuffer写入320 byte的数据进行播放,并记录播放位置(FramePlayPositon),当暂时退出循环。当下次继续播放时,从FramePlayPositon开始继续播放。

                for (int i = FramePlayPositon; i < AudioFile.Data.FrameNumber; ++i)

               {

                    if (IsSuspend)

                    {

                        break;

                    }

                    ControlPlayPositon = GetControlPosition(i);

                    VoicePlayer.Instance.Play(AudioFile.Data.FrameData[i]);

                    FramePlayPositon = i;

                    Thread.Sleep(19);

         }

 

二、显示播放指针

      为了显示播放进度,用一条红色的竖线表示播放指针,在控件的ControlPlayPositon这个点上绘制。

      在播放过程中为了同步显示自左向右移动的播放指针,需要不停地重绘控件图形,并按新的ControlPlayPositon绘制红色竖线。

                    using (Bitmap canvasDrawedCopy = DeepClone(_CanvasDrawed))

                    {

                        Graphics cursorGraphic = Graphics.FromImage(canvasDrawedCopy);

                        Pen pen = new Pen(Color.FromArgb(191, 0, 0), 2);

                        cursorGraphic.DrawLine(pen, ControlPlayPositon, 0, ControlPlayPositon, Bound.Height);

                        using (Graphics gc = CreateGraphics())

                        {

                            gc.DrawImage(canvasDrawedCopy, 0, 0);

                        }

                        canvasDrawedCopy.Dispose();

             }

 

三、音频数据的复制、剪切、粘贴

      在控件中通过拖动鼠标选中某一块音频内容后,可以通过Ctrl+C进行复制,Ctrl+X进行复制剪切,然后在控件中点击需要插入的位置,按Ctrl+V实现粘贴。

      在音频数据分段表示的基础上,就可以方便地实现这复制、剪切、粘贴功能了。

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)

        {

            if (AllowEdit)

            {

                if (keyData == (Keys.Control | Keys.C))

                {

                    List<byte[]> frameData = GetSelectedFrameData();

                    Clipboard.SetDataObject(frameData);

                }

                else if (keyData == (Keys.Control | Keys.X))

                {

                    List<byte[]> frameData = GetSelectedFrameData();

                    Clipboard.SetDataObject(frameData);

 

                    DeleteSelected();

                }

                else if (keyData == (Keys.Control | Keys.V))

                {

                    IDataObject data = Clipboard.GetDataObject();

                    List<byte[]> frameData = data.GetData(typeof(List<byte[]>)) as List<byte[]>;

                    if (frameData != null && frameData.Count > 0)

                    {

                        if (AudioFile != null)

                        {

                            AudioStream audioStream = new AudioStream();

                            audioStream.CreateWaveFormat(8000);

                            int start = GetFramePosition(MouseStartPoint.X);

                            for (int i = 0; i <= start; ++i)

                            {

                                audioStream.AppendWhole(AudioFile.Data.FrameData[i]);

                            }

 

                            for (int i = 0; i < frameData.Count; ++i)

                            {

                                audioStream.AppendWhole(frameData[i]);

                            }

 

                            for (int i = start + 1; i < AudioFile.Data.FrameNumber; ++i)

                            {

                                audioStream.AppendWhole(AudioFile.Data.FrameData[i]);

                            }

 

                            string fileName = TempPath + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".wav";

                            audioStream.SaveWholeStream(fileName);

                            FileName = fileName;

                            ReFlash();

                        }

                    }

                }

            }

 

            return base.ProcessCmdKey(ref msg, keyData);

}

 

      对这个工具软件感兴趣的朋友可以通过下面这个链接下载,欢迎交流、指正。

      http://Resource.HzBaiLing.cn/upload/VoiceRecord.rar

posted on 2019-03-31 10:24  嵇康  阅读(379)  评论(0编辑  收藏  举报

导航