Form1.frm
上传用户:taijiyi
上传日期:2007-01-06
资源大小:5k
文件大小:11k
源码类别:

语音合成与识别

开发平台:

Visual Basic

  1. VERSION 5.00
  2. Object = "{F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.2#0"; "comdlg32.ocx"
  3. Object = "{F5BE8BC2-7DE6-11D0-91FE-00C04FD701A5}#2.0#0"; "agentctl.dll"
  4. Begin VB.Form frmMain 
  5.    BorderStyle     =   1  'Fixed Single
  6.    Caption         =   "Capture and Save to File Sample"
  7.    ClientHeight    =   5250
  8.    ClientLeft      =   150
  9.    ClientTop       =   720
  10.    ClientWidth     =   4110
  11.    Icon            =   "Form1.frx":0000
  12.    LinkTopic       =   "Form1"
  13.    MaxButton       =   0   'False
  14.    MinButton       =   0   'False
  15.    ScaleHeight     =   5250
  16.    ScaleWidth      =   4110
  17.    StartUpPosition =   3  'Windows Default
  18.    Begin VB.CommandButton cmdStandard 
  19.       Caption         =   "标准发音"
  20.       Height          =   375
  21.       Left            =   2280
  22.       TabIndex        =   8
  23.       Top             =   1800
  24.       Width           =   1455
  25.    End
  26.    Begin VB.TextBox Text1 
  27.       Height          =   2295
  28.       Left            =   360
  29.       MultiLine       =   -1  'True
  30.       TabIndex        =   7
  31.       Text            =   "Form1.frx":000C
  32.       Top             =   2760
  33.       Width           =   3375
  34.    End
  35.    Begin MSComDlg.CommonDialog svFile 
  36.       Left            =   240
  37.       Top             =   840
  38.       _ExtentX        =   847
  39.       _ExtentY        =   847
  40.       _Version        =   393216
  41.       Flags           =   4
  42.    End
  43.    Begin VB.CommandButton cmdStopPlaying 
  44.       Caption         =   "停止回放"
  45.       Height          =   375
  46.       Left            =   2280
  47.       TabIndex        =   4
  48.       Top             =   1200
  49.       Width           =   1455
  50.    End
  51.    Begin VB.CommandButton cmdSaveToFile 
  52.       Caption         =   "保存到文件"
  53.       Height          =   375
  54.       Left            =   360
  55.       TabIndex        =   3
  56.       Top             =   1800
  57.       Width           =   1455
  58.    End
  59.    Begin VB.CommandButton cmdPlayRec 
  60.       Caption         =   "录音回放"
  61.       Height          =   375
  62.       Left            =   360
  63.       TabIndex        =   2
  64.       Top             =   1200
  65.       Width           =   1455
  66.    End
  67.    Begin VB.CommandButton cmdStopRec 
  68.       Caption         =   "停止录音"
  69.       Height          =   375
  70.       Left            =   2280
  71.       TabIndex        =   1
  72.       Top             =   600
  73.       Width           =   1455
  74.    End
  75.    Begin VB.Timer tmrCount 
  76.       Left            =   840
  77.       Top             =   840
  78.    End
  79.    Begin VB.CommandButton cmdStartRec 
  80.       Caption         =   "开始录音"
  81.       Height          =   375
  82.       Left            =   360
  83.       TabIndex        =   0
  84.       Top             =   600
  85.       Width           =   1455
  86.    End
  87.    Begin AgentObjectsCtl.Agent Agent1 
  88.       Left            =   2760
  89.       Top             =   2400
  90.    End
  91.    Begin VB.Label Label1 
  92.       Caption         =   "输入文本"
  93.       Height          =   255
  94.       Left            =   360
  95.       TabIndex        =   9
  96.       Top             =   2460
  97.       Width           =   1695
  98.    End
  99.    Begin VB.Label lblLTime 
  100.       Alignment       =   1  'Right Justify
  101.       Caption         =   "剩余时间:"
  102.       Height          =   255
  103.       Left            =   360
  104.       TabIndex        =   6
  105.       Top             =   120
  106.       Width           =   795
  107.    End
  108.    Begin VB.Label lblTIME 
  109.       BorderStyle     =   1  'Fixed Single
  110.       Caption         =   "Label1"
  111.       Height          =   255
  112.       Left            =   1200
  113.       TabIndex        =   5
  114.       Top             =   120
  115.       Width           =   1035
  116.    End
  117.    Begin VB.Menu mnuFile 
  118.       Caption         =   "文件[&F]"
  119.       Begin VB.Menu mnuExit 
  120.          Caption         =   "退出[&X]"
  121.       End
  122.    End
  123. End
  124. Attribute VB_Name = "frmMain"
  125. Attribute VB_GlobalNameSpace = False
  126. Attribute VB_Creatable = False
  127. Attribute VB_PredeclaredId = True
  128. Attribute VB_Exposed = False
  129. Dim dx As New DirectX7
  130. Dim ds As DirectSound
  131. Dim dsb As DirectSoundBuffer
  132. Dim dsd As DSBUFFERDESC
  133. Dim dsc As DirectSoundCapture
  134. Dim dscb As DirectSoundCaptureBuffer
  135. Dim dscd As DSCBUFFERDESC
  136. Dim CaptureWave As WAVEFORMATEX
  137. Dim capCURS As DSCURSORS
  138. Dim ByteBuffer() As Integer
  139. Dim CNT As Integer
  140. Dim cCaps As DSCCAPS
  141. Dim gfPlay As Boolean
  142. Dim Genie As IAgentCtlCharacterEx
  143. Private Sub cmdPlayRec_Click()
  144.     '将音频捕捉缓冲转换为声音缓冲
  145.     ConvertToSBuffer
  146.     
  147.     '判断声音缓冲是否建立成功。
  148.     If dsb Is Nothing Then
  149.         Exit Sub
  150.     Else
  151.         dsb.Play DSBPLAY_DEFAULT
  152.         tmrCount.Enabled = True
  153.         CNT = 0
  154.         lblTIME.Caption = vbNullString
  155.         If gfPlay Then cmdStopPlaying.Enabled = True
  156.     End If
  157. End Sub
  158. Private Sub cmdSaveToFile_Click()
  159. On Error Resume Next
  160.     
  161.     Dim FileLocal As String
  162.     
  163.     ConvertToSBuffer
  164.     
  165.     If dsb Is Nothing Then Exit Sub
  166.     
  167.     cmdStopPlaying.Enabled = False
  168.     
  169.     tmrCount.Enabled = False
  170.     lblTIME.Caption = vbNullString
  171.     CNT = 0
  172.     
  173.     If dsb Is Nothing Then
  174.         MsgBox "你需要首先执行录音操作"
  175.         Exit Sub
  176.     End If
  177.     
  178.     svFile.Filter = "*.wav"
  179.     svFile.DialogTitle = "保存音频文件"
  180.     svFile.ShowSave
  181.     
  182.     If Right(svFile.FileName, 4) <> ".wav" And svFile.FileName <> vbNullString Then
  183.         FileLocal = svFile.FileName
  184.         FileLocal = FileLocal & ".wav"
  185.     Else
  186.         FileLocal = svFile.FileName
  187.     End If
  188.         
  189.     If FileLocal = vbNullString Then Exit Sub
  190.     
  191.     If Mid(FileLocal, 2, 1) <> ":" Then Exit Sub
  192.     
  193.     If Right(FileLocal, 3) <> "wav" Then
  194.         MsgBox "请输入音频文件的正确名字,例如 something.wav", vbApplicationModal
  195.         Exit Sub
  196.     End If
  197.     
  198.     dsb.SaveToFile FileLocal
  199. End Sub
  200. Private Sub cmdStandard_Click()
  201.     If Text1.Text = "" Then
  202.         MsgBox "你必须在文本框中输入语句", vbCritical, "错误"
  203.         Exit Sub
  204.     End If
  205.     
  206.     If Genie Is Nothing Then
  207.         Agent1.Connected = True
  208.         Agent1.Characters.Load "Genie"
  209.         Set Genie = Agent1.Characters("Genie")
  210.         If Genie Is Nothing Then End
  211.         Genie.LanguageID = &H409
  212.         Genie.SoundEffectsOn = True
  213.     End If
  214.     Genie.Show True
  215.     Genie.Speak Text1.Text
  216. End Sub
  217. Private Sub cmdStartRec_Click()
  218.     Set dscb = Nothing
  219.     Call InitCapture
  220.     
  221.     dscb.start DSCBSTART_DEFAULT
  222.     
  223.     tmrCount.Interval = 1000
  224.     tmrCount.Enabled = True
  225.     cmdStopRec.Enabled = True
  226.     cmdStartRec.Enabled = False
  227. End Sub
  228. Private Sub cmdStopPlaying_Click()
  229.     
  230.     If dsb Is Nothing Then Exit Sub
  231.     
  232.     Dim l_st As Long
  233.     Dim l_soundStatus As Long
  234.     
  235.     '检测音频捕捉缓冲是否在处于运行状态。
  236.     l_st = dscb.GetStatus()
  237.     If (l_st And DSCBSTATUS_CAPTURING) Then
  238.         dscb.Stop
  239.     End If
  240.     
  241.     '检测音频捕捉是否处于播放状态
  242.     l_soundStatus = dsb.GetStatus()
  243.     If (l_soundStatus And DSBSTATUS_PLAYING) Then
  244.         dsb.Stop
  245.         dsb.SetCurrentPosition 0
  246.     End If
  247.     
  248.     tmrCount.Enabled = False
  249.     
  250.     CNT = 0
  251.     lblTIME.Caption = vbNullString
  252.     cmdStopPlaying.Enabled = False
  253. End Sub
  254. Private Sub cmdStopRec_Click()
  255.     Dim l_bufferS As Long
  256.     
  257.     If dscb Is Nothing Then Exit Sub
  258.     
  259.     cmdSaveToFile.Enabled = True
  260.     If gfPlay Then cmdPlayRec.Enabled = True
  261.     
  262.     l_bufferS = dscb.GetStatus()
  263.     If (l_bufferS And DSCBSTATUS_CAPTURING) Then
  264.         dscb.Stop
  265.     End If
  266.     
  267.     tmrCount.Enabled = False
  268.     CNT = 0
  269.     lblTIME.Caption = vbNullString
  270.     cmdStartRec.Enabled = True
  271.     cmdStopRec.Enabled = False
  272. End Sub
  273. Private Sub Form_Load()
  274.     On Local Error GoTo errOut
  275.     Set dsc = dx.DirectSoundCaptureCreate(vbNullString)
  276.     On Error Resume Next
  277.     Set ds = dx.DirectSoundCreate(vbNullString)
  278.     If Err.Number = DSERR_ALLOCATED Then '声卡不支持全双工工作
  279.         gfPlay = False
  280.         MsgBox "声卡不支持全双工工作,但是仍然可以录音。", _
  281.             vbOKOnly Or vbInformation, "不支持全双工"
  282.     Else
  283.         gfPlay = True
  284.         ds.SetCooperativeLevel Me.hWnd, DSSCL_NORMAL
  285.     End If
  286.     On Local Error GoTo errOut
  287.     
  288.     '初始化音频捕捉
  289.     InitCapture
  290.     
  291.     cmdSaveToFile.Enabled = False
  292.     cmdPlayRec.Enabled = False
  293.     cmdStopPlaying.Enabled = False
  294.     cmdStopRec.Enabled = False
  295.     
  296.     lblTIME.Caption = vbNullString
  297.     Text1.Text = ""
  298.     Exit Sub
  299. errOut:
  300.     MsgBox "无法初始化声卡,退出程序", vbOKOnly Or vbCritical
  301.     End
  302. End Sub
  303. Private Sub ConvertToSBuffer()
  304.     Dim l_captureS As Long
  305.     
  306.     l_captureS = dscb.GetStatus()
  307.     If (l_captureS And DSCBSTATUS_CAPTURING) Then
  308.         dscb.Stop
  309.     End If
  310.     
  311.     '获得音频捕捉信息
  312.     dscb.GetCurrentPosition capCURS
  313.     dsd.lBufferBytes = capCURS.lWrite * dscd.fxFormat.nBlockAlign
  314.     dsd.lFlags = DSBCAPS_CTRLVOLUME Or DSBCAPS_STATIC
  315.     
  316.     '无法写入
  317.     If capCURS.lWrite = 0 Then
  318.         Exit Sub
  319.     End If
  320.     
  321.     Set dsb = ds.CreateSoundBuffer(dsd, dscd.fxFormat)
  322.     ReDim ByteBuffer(capCURS.lWrite * dscd.fxFormat.nBlockAlign + 1)
  323.     dscb.ReadBuffer 0, capCURS.lWrite * dscd.fxFormat.nBlockAlign, ByteBuffer(0), _
  324.         DSCBLOCK_DEFAULT
  325.     dsb.WriteBuffer 0, capCURS.lWrite * dscd.fxFormat.nBlockAlign, ByteBuffer(0), _
  326.         DSBLOCK_DEFAULT
  327. End Sub
  328. Private Function WaveEx(Hz As Long, Channels As Integer, BITS As Integer) As WAVEFORMATEX
  329.     WaveEx.nFormatTag = WAVE_FORMAT_PCM
  330.     WaveEx.nChannels = Channels
  331.     WaveEx.lSamplesPerSec = Hz
  332.     WaveEx.nBitsPerSample = BITS
  333.     WaveEx.nBlockAlign = Channels * BITS / 8
  334.     WaveEx.lAvgBytesPerSec = WaveEx.lSamplesPerSec * WaveEx.nBlockAlign
  335.     WaveEx.nSize = 0
  336. End Function
  337. Private Sub InitCapture()
  338.     '设置音频捕捉缓冲
  339.     dsc.GetCaps cCaps
  340.     
  341.     '设置采样频率以及精度
  342.     If cCaps.lFormats And WAVE_FORMAT_2M08 Then
  343.         CaptureWave = WaveEx(22050, 1, 8)
  344.     ElseIf cCaps.lFormats And WAVE_FORMAT_1M08 Then
  345.         CaptureWave = WaveEx(11025, 1, 8)
  346.     Else
  347.         MsgBox "你的声卡不支持音频捕捉!", vbApplicationModal
  348.         End
  349.     End If
  350.     
  351.     dscd.fxFormat = CaptureWave
  352.     dscd.lBufferBytes = CaptureWave.lAvgBytesPerSec * 20
  353.     dscd.lFlags = DSCBCAPS_WAVEMAPPED
  354.     
  355.     Set dscb = dsc.CreateCaptureBuffer(dscd)
  356. End Sub
  357. Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
  358.     Call CleanUp
  359.     End
  360. End Sub
  361. Private Sub CleanUp()
  362.     '清除全部对象
  363.     Set dx = Nothing
  364.     Set ds = Nothing
  365.     Set dsb = Nothing
  366.     Set dsc = Nothing
  367.     Set dscb = Nothing
  368.     Set Genie = Nothing
  369.     Agent1.Connected = False
  370.     Erase ByteBuffer
  371. End Sub
  372. Private Sub mnuExit_Click()
  373.     Unload Me
  374. End Sub
  375. Private Sub tmrCount_Timer()
  376. On Error Resume Next
  377.     
  378.     CNT = CNT + 1
  379.     
  380.     If CNT = 19 Then
  381.         dscb.Stop
  382.         lblTIME.Caption = "Full"
  383.         frmMain.Refresh
  384.         tmrCount.Enabled = False
  385.                 
  386.         cmdSaveToFile.Enabled = True
  387.         If gfPlay Then cmdPlayRec.Enabled = True
  388.         If gfPlay Then cmdStopPlaying.Enabled = True
  389.         
  390.         Exit Sub
  391.     End If
  392.     
  393.     lblTIME.Caption = CNT
  394.     
  395.     '检测音频捕捉缓冲状态
  396.     Dim l_sBs As Long
  397.     If Not (dsb Is Nothing) Then
  398.         l_sBs = dsb.GetStatus()
  399.         If (l_sBs And DSBSTATUS_PLAYING) Then
  400.         Else
  401.             If cmdStartRec.Enabled = True Then
  402.                 tmrCount.Enabled = False
  403.                 CNT = 1
  404.                 lblTIME.Caption = vbNullString
  405.                 cmdStopPlaying.Enabled = False
  406.             End If
  407.         End If
  408.     End If
  409. End Sub