• .net中语音识别和语音合成入门篇


    准备

    在.net中使用语音识别和语音合成技术,需要借助微软的Speech SDK,如果是要在Web应用程序中使用,则需要Speech Application SDK。其中Speech SDK可以在http://www.microsoft.com/speech/download/old/sapi5.asp下载,其中有两个文件Speech SDK 5.1和5.1 Language Pack,前者是开发包,但是其中只包含对英文的支持,后者是中文和日文的语言包,装完就能支持中文了。

    SDK组成结构



    演练

    1. 打开vs2005,建立一个windows application,在设计窗体中加入一个label,一个richtextbox(用于输入要读的文本),以及一个button。并分别设置的label与button的Text属性。如下图


    2. 添加必要的引用,项目->添加引用->COM 选择Microsoft Speech Object Library点确定退出。

    3. 双击button,为其添加事件。在代码页顶端先添加命名空间,代码如:


    using SpeechLib;

    4. button的事件处理程序代码如下。


    private void button1_Click(object sender, EventArgs e)
    {
    SpVoiceClass voice = new SpVoiceClass();
    voice.Voice = voice.GetVoices(string.Empty, string.Empty).Item(3); //其中3为中文,024为英文
    voice.Speak(richTextBox1.Text,SpeechVoiceSpeakFlags.SVSFDefault);
    }

    5. 按F5运行,在空白区域输入文字,点朗读,试试效果吧。

    SpVoiceClass详解

    属性
    描述

    AlertBoundary
    取得或设置停顿分界线。

    AllowAudioOutputFormatChangesOnNextSet
    设置是否允许声音自动调整到合适状态以适应其音频输出。

    AudioOutput
    .取得或设置当前声音使用的的音频输出对象

    AudioOutputStream
    取得或设置当前声音使用的的音频输出流对象。

    EventInterests
    取得或设置当前声音返回的事件类型。

    Priority
    取得或设置声音的优先级。

    Rate
    取得或设置阅读的速度。

    Status
    返回一个ISpeechVoiceStatus 对象用于显示当前阅读和事件的状态

    SynchronousSpeakTimeout
    取得或设置一个时间间隔,用于标识多久未获得一个输出设备后,一个同步的Speak 和SpeakStream将终止,以毫秒计算。

    Voice
    取得或设置发音对象。

    Volume
    取得或设置声音的大小 。




    方法
    描述

    DisplayUI
    是否在控制面板中展示详细设置。

    GetAudioOutputs
    返回一个可用的音频输出标记。

    GetVoices
    返回一个可用的发音对象。

    IsUISupported
    决定是否能通过控制棉板的音频设置来控制。

    Pause
    暂停朗读。.

    Resume
    恢复暂停,继续播放。

    Skip
    在当前输入的文本流中向前或向后跳一定距离再播放。

    Speak
    阅读一个字符串。

    SpeakCompleteEvent
    得到一个朗读完毕的时间句柄

    SpeakStream
    朗读一个文本流或一个声音文件。

    WaitUntilDone
    阻塞进程,直到声音播放完毕或者超时。.


    .(本文只是这个系列的第一篇,至于其他内容将在后面的篇幅讲到,欢迎感兴趣的朋友和我交流.)
    .net中语音识别和语音合成(二)语音合成提高篇

    在.net中语音识别和语音合成(一)入门篇中介绍了关于语音合成的一些基础知识,就是先j建立一个SpVoiceClass类的对象,然后调用对象的GetVoices方法取的一个发音的对象,但是通过设置该方法的参数只能建立中文发音或是英文发音的对象,而对于中英文混合的文本却没有办法。为解决这个问题,可以对字符串中的每的字符的ASC码进行判断,进而分辨传入的字符串是中文还是英文。以下是判断的代码。

    1 public bool Analyse(string strSpeak)
    2 {
    3 int iCbeg = 0 ;
    4 int iEbeg = 0 ;
    5 bool IsChina = true ;
    6 for(int i=0;i<strSpeak.Length;i++)
    7 {
    8 char chr = strSpeak[i] ;
    9 if (IsChina)
    10 {
    11 if (chr<=122&&chr>=65)
    12 {
    13 int iLen = i - iCbeg ;
    14 string strValue =
    15strSpeak.Substring(iCbeg,iLen) ;
    16 SpeakChina(strValue) ;
    17 iEbeg = i ;
    18 IsChina = false ;
    19 }
    20 }
    21 else
    22 {
    23 if (chr>122||chr<65)
    24 {
    25 int iLen = i - iEbeg ;
    26 string strValue =
    27strSpeak.Substring(iEbeg,iLen) ;
    28 this.SpeakEnglishi(strValue) ;
    29 iCbeg = i ;
    30 IsChina = true ;
    31 }
    32 }
    33 }
    34 return IsChina;
    35}
    对于Speak方法的参数,第一个是一个字符串类型,第二个是一个SpeechVoiceSpeakFlags类型的枚举。当将其设置为SVSFDefault时,则第一个就是要读的文本,若将其设置为SVSFIsFilename时,第一个参数就是所要读的文本的文件名,而不是要读的内容。


    下面介绍这个类的SpeakStream方法,这个方法有2个参数,第一个是SpeechBaseStream,第二和Speak一样,是一个SpeechVoiceSpeakFlags类型的枚举。SpeechBaseStream是一个接口,继承它的有3个对象,这3个都很相似,先介绍其中之一SpFileStream。SpFileStream有3个比较常用的方法:Read,Seek,Write。其中Read方法可以创建一个*.wav文件,以下代码演示了创建文件的步骤:

    SpFileStreamClass fs1 = new SpFileStreamClass();
    SpVoiceClass v = new SpVoiceClass();
    fs1.Open(textBox1.Text, SpeechStreamFileMode.SSFMCreateForWrite, false);
    //textBox1.text是要创建的文件的路径。
    v.AudioOutputStream = fs1;
    string[] ss = new string[4] { "this", "is", "a", "demo" };
    foreach (string s in ss)
    {
    v.Speak(s, SpeechVoiceSpeakFlags.SVSFlagsAsync);
    }
    fs1.Close();
    下面的代码将用于展示Speak与SpeakStream:

    SpFileStreamClass fs1 = new SpFileStreamClass();
    SpFileStreamClass fs2 = new SpFileStreamClass();
    SpVoiceClass v = new SpVoiceClass();
    fs1.Open(textBox1.Text, SpeechStreamFileMode.SSFMOpenForRead, false);
    fs2.Open(textBox2.Text, SpeechStreamFileMode.SSFMOpenForRead, false);
    v.Speak("This is the first sound file", SpeechVoiceSpeakFlags.SVSFlagsAsync);
    v.SpeakStream(fs1, SpeechVoiceSpeakFlags.SVSFlagsAsync);
    v.Speak("This is the second sound file", SpeechVoiceSpeakFlags.SVSFlagsAsync);
    v.SpeakStream(fs2, SpeechVoiceSpeakFlags.SVSFlagsAsync);
    fs1.Close();
    fs2.Close();
  • 相关阅读:
    压测 正则 性能分析
    时间复杂度 根号n
    务端如何防止重复支付 架构文摘 2021-05-02
    工具大于约定和文档
    千亿级公司低代码平台的测试体系介绍
    疑惑 题解
    计算几何相关总结
    树 题解
    矩阵加速相关总结
    loj6274 数字 题解
  • 原文地址:https://www.cnblogs.com/cuihongyu3503319/p/658535.html
Copyright © 2020-2023  润新知