⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mstts文字朗读技术.txt

📁 一个tts例子
💻 TXT
字号:
msTTS文字朗读技术

在安装了winxp后,在控制面板上会产生一个《语音》设备,它实际上就是
大名鼎鼎的msTTS引擎,利用它,可以使我们的应用程序具有阅读中英文文本的
能力。虽然最新的msTTS技术推出已经两年有余,介绍此技术的文章却很难找到。
要编程只有阅读微软公司的英文版文档,这对非计算机专业的教师十分困难。
现对此技术作一最基本的介绍。这里总是假设你已经有VB的基本知识,和TTS技术
关系不大的内容只作简单介绍。

一)建立编程环境

  如果是XP操作系统,到我的讨论组 http://kaoke.cnnb.net 文件共享下载
《考客--msTTSXP语音库》和〈考客--msTTS中文语音库〉升级你的msTTS引擎。
98操作系统(由于我没有主页,不能放3M以上文件)到
http://www.smartread.net/cn/service/alldownload.html精灵软件公司
下载 英文语音库(免费)
下载 中文男声语音库(免费)
下载 中文女声语音库单机版(免费500次)。
  在安装中可能安装程序不会运行,你需要先下载安装Windows Installer系统  
MSI文件是微软最新推出的软件安装格式,安装时必须在你的电脑上有Windows Installer系统,
一般情况下,Windows系统已经内置了Windows Installer。但是如果你双击MSI文件安装时出现错误,
(正确时*.msi文件的图标就象一台电脑) 
说明Installer已经损坏,你必须先完成Windows Installer系统安装。Windows 98,ME的用户:InstMsiA.exe 
Windows NT4.0,2000 xp的用户:InstMsiW.exe  
你到www.sohu.com打入关键字  Windows Installer或InstMsiA 或InstMsiW搜索一下,然后下载安装。
再安装tts语音驱动器。  
  安装后启动VB,点文件/新建/标准EXE,点工程/引用/浏览 到c:/windos/sYstem 把sapi.dll引用进来,
在microsoft speech object library前面打钩,按确定。但和一般控件不同的是,它在工具箱上并
不显示。

二)设计控件
在form1上放一个timer控件timer1,设置interver=2000
放一个CommonDialog控件CommonDialog1
放一个Label控件Label1
放一个Label控件Label2
放一个Text控件Texten,设置hideselection=false,multline=true,scrollbar=3-both
设计菜单 标题〈打开文本〉名称〈 menu_open_text 〉
菜单  标题〈打开单词〉名称〈 menu_open_word〉
菜单  标题〈关于考客〉名称〈 menu_about〉

三)定义数据类型和变量
Option Explicit
Private Type enl_CNN_TYPE '一个数据类型,用来记录一个单词
    ENL As String '英文
    CNN As String '中文
End Type

Const DefaultFmt = "SAFT22kHz16BitMono"      '输出音频默认值
Dim enl_cnn_WORD(1 To 600) As enl_CNN_TYPE   '保存600个单词的数组
Dim speaker_IDX(0 To 20)               As Integer
Dim total_WORD                         As Integer
Dim play_SERIAL                        As Integer

Dim readTOKEN As Integer
'驱动器实例  讲英语 带事件
Dim WithEvents eVoice      As SpVoice
'驱动器实例  讲中文 不带事件
Dim cVoice                 As SpVoice

四)初始化驱动器
Private Sub Form_Load()
Dim i       As Integer
'试图装入msTTS驱动器
'************************************************************
On Error GoTo tts_err:

    App.Title = "考客(VER0.00版)"
    Dim Token         As ISpeechObjectToken
    Set eVoice = New SpVoice
    Set cVoice = New SpVoice
    '设置阅读速度-10到10之间
    eVoice.Rate = -1
    '初始化标记读者不可用
    For i = 0 To 20
    speaker_IDX(i) = -1
    Next
     
    '读取可以使用的语音
    i = 0
    For Each Token In eVoice.GetVoices
       
        '以下设置读者可用
        If Token.GetDescription() = "Microsoft Mary" Then
            speaker_IDX(1) = i
        ElseIf Token.GetDescription() = "Microsoft Mike" Then
            speaker_IDX(2) = i
        ElseIf Token.GetDescription() = "Microsoft Sam" Then
            speaker_IDX(3) = i
        ElseIf Token.GetDescription() = "Microsoft Simplified Chinese" Then
            speaker_IDX(4) = i
        ElseIf Token.GetDescription() = "中文女声语音(Ch.Female) [单机版]" Then
            speaker_IDX(5) = i
        End If
        i = i + 1
    Next
    
    '优先使用的发音者
    If speaker_IDX(1) <> -1 Then
      Set eVoice.Voice = eVoice.GetVoices().Item(speaker_IDX(1))
      ' MsgBox "由玛丽小姐给你阅读!"
    ElseIf speaker_IDX(2) <> -1 Then
      Set eVoice.Voice = eVoice.GetVoices().Item(speaker_IDX(2))
       'MsgBox "由迈克先生给你阅读!"
    ElseIf speaker_IDX(3) <> -1 Then
      Set eVoice.Voice = eVoice.GetVoices().Item(speaker_IDX(3))
       'MsgBox "由山姆大叔给你阅读!"
    End If
    
'优先使用中文的发音者
If speaker_IDX(5) <> -1 Then
      Set cVoice.Voice = cVoice.GetVoices().Item(speaker_IDX(5))
ElseIf speaker_IDX(4) <> -1 Then
      Set cVoice.Voice = cVoice.GetVoices().Item(speaker_IDX(4))
Else
      MsgBox "系统可能没有中文阅读驱动器"
End If

Exit Sub
tts_err:
End Sub



五)打开要阅读的文本文件
Private Sub menu_open_text_Click()
Dim fname          As String
Dim fno            As Integer
On Error GoTo ErrHandler
'-------------------------------------------------------------------------------------
     '以下设置打开文件对话框属性
    CommonDialog1.CancelError = True
    CommonDialog1.DialogTitle = "请选择你要打开的文件"
    CommonDialog1.InitDir = App.Path
    CommonDialog1.Filter = "文本文件*.txt|*.txt"
    CommonDialog1.FileName = "1.TXT"
    CommonDialog1.ShowOpen
    fname = CommonDialog1.FileName
'判断文件存在性
If Len(Dir$(fname)) = 0 Then
    Err.Raise 53 '文件没有找到
End If
Texten.Text = ""
fno = FreeFile()
Open fname For Binary Access Read As #fno
Texten.Text = StrConv(InputB$(LOF(fno), 1), vbUnicode)
Close fno

'停止上一次读
eVoice.Speak vbNullString, SVSFPurgeBeforeSpeak
cVoice.Speak vbNullString, SVSFPurgeBeforeSpeak
'开始读
eVoice.Speak Texten.Text, SVSFlagsAsync
readTOKEN = 1
Me.Caption = App.Title + "    " + fname

Exit Sub
ErrHandler:
End Sub

六)打开要阅读的单词文件
Private Sub menu_open_word_Click()
Dim fname, en           As String
Dim n, i, fno           As Integer
On Error GoTo ErrHandler            '捕捉严重错误
    CommonDialog1.CancelError = True'以下设置打开文件对话框属性
    CommonDialog1.DialogTitle = "请选择要打开的文件!"
    CommonDialog1.InitDir = App.Path
    CommonDialog1.Filter = "*.txt|*.txt;"
    CommonDialog1.DefaultExt = "txt"
    CommonDialog1.FileName = "单词第1课A.txt" '默认文件名
    CommonDialog1.ShowOpen
    fname = CommonDialog1.FileName            '从对话框取得文件名
'判断文件存在性
If Len(Dir$(fname)) = 0 Then
    Err.Raise 53 '文件没有找到
End If
   

i = 0
fno = FreeFile                        '取得自由文件号
Open fname For Input As #fno          '以 INPUT 方式打开文件
Do While Not EOF(fno) And i < 600     '把单词文件读到数组
   Input #fno, en                     '读入英文
   If en <> "" Then
    i = i + 1
    enl_cnn_WORD(i).ENL = en
    
    If Not EOF(fno) Then
    Input #fno, enl_cnn_WORD(i).CNN
    End If
                                      
  End If
Loop
Close fno

'停止上一次读
eVoice.Speak vbNullString, SVSFPurgeBeforeSpeak 
cVoice.Speak vbNullString, SVSFPurgeBeforeSpeak 
'单词总数
total_WORD = i
'读第一个单词
play_SERIAL = 1
'播放模式
readTOKEN = 0
Texten.Text = ""
Me.Caption = App.Title + "    " + fname
Exit Sub
ErrHandler:
Call MsgBox(Error$, 48)
End Sub


七)阅读单词
Private Sub Timer1_Timer()
Dim readEN, readCN As String

If readTOKEN = 0 Then
If total_WORD > 0 Then
'为了读和显示同步,读空了驱动器队列才读下一句
If (eVoice.Status.RunningState = SRSEDone) And (cVoice.Status.RunningState = SRSEDone) Then
             '显示的文本
          readEN = enl_cnn_WORD(play_SERIAL).ENL
          readCN = enl_cnn_WORD(play_SERIAL).CNN
             '读英文
                     Label1.Caption = readEN
                     eVoice.Speak readEN, SVSFlagsAsync
             '读中文
                     Label2.Caption = readCN
                     cVoice.Speak readCN, SVSFlagsAsync
             '调整参数
                 play_SERIAL = play_SERIAL + 1
             If play_SERIAL > total_WORD Then
                '读完了回到第一个单词再读
                play_SERIAL = 1
             End If
End If
End If
End If
Exit Sub
ErrHandler:
End Sub


八)自动重复读
Private Sub eVoice_EndStream(ByVal StreamNumber As Long, ByVal StreamPosition As Variant)
 '一篇读完触发此事件
   On Error GoTo ErrHandler
              '读文本
              If readTOKEN = 1 Then
                  eVoice.Speak Texten.Text, SVSFlagsAsync
              End If
Exit Sub
ErrHandler:
End Sub

九)高亮度显示当前读文本
Private Sub eVoice_Sentence(ByVal StreamNumber As Long, ByVal StreamPosition As Variant, ByVal CharacterPosition As Long, ByVal Length As Long)
 '进入一句开始位置触发此事件
On Error GoTo ErrHandler
 If readTOKEN = 1 Then
    '高亮度显示当前读文本
     If Length > 0 Then
        Texten.SelStart = CharacterPosition
        Texten.SelLength = Length
     End If
End If
Exit Sub
ErrHandler:
End Sub
十)版权信息
Private Sub menu_about_Click()
Call MsgBox("浙江省象山县定塘中学" + vbCrLf + "顾熙杰" + vbCrLf + "email:pcgoer@163.net", 48)
End Sub
十一)感兴趣的教师请到http://kaoke.cnnb.net下载《考客0.00版》源代码。
      定塘中学 顾熙杰
      pcgoer@163.net
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -