首先添加一個系統(tǒng)的語音COM組件的引用microsoft speech object library然后在程序中聲明一個語音類dim RC As SpeechLib.SpSharedRecoContext這個類有一些事件,如果你要處理它的一些事件,可以用withevent來聲明然后在窗體LOAD事件或你需要的地方先創(chuàng)建一個實例RC = New SpeechLib.SpSharedRecoContext當一個RC被實例化后,系統(tǒng)就會運行語音識別程序.前提是你的系統(tǒng)已經(jīng)正確安裝這個功能.一般默認就已經(jīng)安裝好的.其次提醒一下,WIN7的語音識別比XP的好N倍.從閱讀到偵聽都好很多.然后就可以在你需要閱讀的地方使用RC.Voice.Speak("hello 我", 11)11那里是一些枚舉,用來標識系統(tǒng)用前臺還是后臺或其他方式來閱讀文字,簡單的來說就是閱讀的時候不會卡住你的程序.你可以選其他的枚舉來試試作用.以上為閱讀部分.如果需要程序聽你說話,則需要聲明一個偵聽類dim RG As SpeechLib.ISpeechRecoGrammar在初始化時將之與上面的RC建立關系,此時則必須要用withevent來聲明上面的RC,因為涉及電腦聽到你的語音后,會觸發(fā)一個事件,并將聽到的內(nèi)容傳遞到該事件.其次,要讓系統(tǒng)聽到的解析為命令,就必須準備一個XML結構的文件來保存那些固定的命令.如果電腦在XML文件中找不到那些固定命令或同時不屬于系統(tǒng)命令,電腦將會將其解釋為聽寫.RG = RC.CreateGrammar '(0)

站在用戶的角度思考問題,與客戶深入溝通,找到南充網(wǎng)站設計與南充網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設計與互聯(lián)網(wǎng)技術結合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站設計、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名與空間、虛擬主機、企業(yè)郵箱。業(yè)務覆蓋南充地區(qū)。
RG.CmdLoadFromFile("聽到.xml", SpeechLib.SpeechLoadOption.SLODynamic)
RG.CmdSetRuleIdState(0, SpeechLib.SpeechRuleState.SGDSActive)然后寫一個過程來處理聽到的事件Private Sub 聽到命令(ByVal StreamNumber As Integer, ByVal StreamPosition As Object, ByVal RecognitionType As SpeechLib.SpeechRecognitionType, ByVal 話語 As SpeechLib.ISpeechRecoResult) Handles RC.Recognition RC.Voice.Speak("我聽到了" 話語.PhraseInfo.GetText, 11)End Sub以上為偵聽部分.下面列一個XML的例文?xml version="1.0" encoding="gb2312"?
GRAMMAR LANGID="804"
RULE NAME="命令" TOPLEVEL="ACTIVE"
L
P打開播放器
P上我的QQ
P關閉你自己 /L
/RULE
/GRAMMAR要讓系統(tǒng)正確地偵聽到你說的話,前提你必須運行語音識別程序并讓其激活到"正在聆聽"狀態(tài).并且你必須有一個能正常使用的話筒而且保證話筒已經(jīng)打開.(廢話-_-|||)以上就是用VB.NET語音識別的最基本的一些操作.希望對你有幫助.更深入的內(nèi)容有興趣的話可以和我一起研究.
一、把你的提示音用轉(zhuǎn)換器轉(zhuǎn)化為wav格式,提示音文件不可太大,否則可能無法播放,控制在幾Kb以內(nèi)!
二、把wav格式的聲音做成vb資源文件
三、用如下代碼
Private Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (lpszSoundName As Any, ByVal uFlags As Long) As Long'API聲明要放在程序代碼最頂上
Private Sub Command2_Click()
Dim B() As Byte
B = LoadResData(101, "CUSTOM")
sndPlaySound B(0), H4 '播放內(nèi)存里的聲音,H8 ' 循環(huán)播放,H1 ' 異步播放
End Sub
建一個窗體,里面添加一個按鈕,代碼里拷入下面的代碼,運行后,單擊按鈕
Private Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long
Private Const SND_ASYNC = H1 '異步播放
Private Const SND_SYNC = H0 '同步播放 (缺省)
Private Sub Command1_Click()
Dim SoundFile As String, Result As Long
SoundFile = "c:\Windows\Media\chord.wav"
Result = sndPlaySound(SoundFile, SND_ASYNC)
End Sub
說明:
要播放不同的聲音,例如0-9,你找到相應的wav文件,編程實現(xiàn)就可以了。
PS:沒注意到你是VB.NET,上面的代碼是VB6的,生成工程文件,直接用.NET打開并自動轉(zhuǎn)換,也可以使用。
把類似下面的三行代碼放入timer即可。關鍵是放音程序。
DealWav.mciSendString "open " sA " alias wav", sB, Len(sB), 0
DealWav.mciSendString "play wav ", sB, Len(sB), 0
DealWav.mciSendString "close wav ", sB, Len(sB), 0
送你DealWav模塊
Dim WAVBuffer() As Byte
Dim DataLenOut As Long
Dim Datapos1 As Long
Dim Datapos2 As Long
Dim ChunkLen As Long
Dim factpos As Long
Type PCMWAVEFORMAT '標準 PCM 格式定義
wFormatTag As Integer '格式標志,區(qū)分不同的格式,PCM 為 1
nChannels As Integer '音頻通道數(shù),單聲道為 1 ,立體聲為 2
nSamplesPerSec As Long '每秒的采樣數(shù),即采樣率。
'標準的采樣率有8.000 kHz 、11.025 kHz 、
'22.050 kHz 、44.100 kHz 等。
nAvgBytesPerSec As Long '每秒的字節(jié)數(shù),即數(shù)據(jù)率。
'數(shù)據(jù)率 = 通道數(shù)×采樣率×采樣大小 / 8
nBlockAlign As Integer '塊對齊,即波形數(shù)據(jù)的最小單位。
'塊對齊 = 通道數(shù)×采樣大小 / 8
wBitsPerSample As Integer '每個采樣所占的位數(shù),即采樣大小。
'采樣大小有 8 位和 16 位兩種。
End Type
Private Type WaveHead
strRiff As String * 4 ' 00H 4 char "RIFF"標志
lngFileLen As Long ' 04H 4 long int 文件長度
strWave As String * 4 ' 08H 4 char "WAVE"標志
strFmt As String * 4 ' 0CH 4 char "fmt"標志
lngTmp As Long ' 10H 4 過渡字節(jié)(不定)
intFormat As Integer ' 14H 2 int 格式類別(10H為PCM形式的聲音數(shù)據(jù))
intChan As Integer ' 16H 2 int 通道數(shù),單聲道為1,雙聲道為2
intFreq As Long ' 18H 2 int 采樣率(每秒樣本數(shù)),表示每個通道的播放速度,
lngSendSpeed As Long ' 1CH 4 long int 波形音頻數(shù)據(jù)傳送速率,其值為通道數(shù)×每秒數(shù)據(jù)位數(shù)×每樣本的數(shù)據(jù)位數(shù)/8。播放軟件利用此值可以估計緩沖區(qū)的大小。
intBlock As Integer ' 20H 2 int 數(shù)據(jù)塊的調(diào)整數(shù)(按字節(jié)算的),其值為通道數(shù)×每樣本的數(shù)據(jù)位值/8。播放軟件需要一次處理多個該值大小的字節(jié)數(shù)據(jù),以便將其值用于緩沖區(qū)的調(diào)整。
intBit As Integer ' 22H 2 每樣本的數(shù)據(jù)位數(shù),表示每個聲道中各個樣本的數(shù)據(jù)位數(shù)。如果有多個聲道,對每個聲道而言,樣本大小都一樣。
strData As String * 4 ' 24H 4 char 數(shù)據(jù)標記符"data"
lngDataLenth As Long ' 28H 4 long int 語音數(shù)據(jù)的長度
End Type
Public Declare Function sndPlaySound Lib "winmm" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long
' flag uitzetten
Public Const SND_SYNC = H0
Public Const SND_ASYNC = H1
Public Const SND_NODEFAULT = H2
Public Const SND_MEMORY = H4
Public Const SND_LOOP = H8
Public Const SND_NOSTOP = H10
Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" (ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Long
Public Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
Public Declare Function mciExecute Lib "winmm.dll" (ByVal lpstrCommand As String) As Long
'Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" (ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Long
Public Declare Sub RtlMoveMemory Lib "kernel32" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
Private Sub Command1_Click()
'為了防止隨意選取的兩個wav文件格式不同,我干脆就將同一個文件重復兩次
LinkWav "C:\WINNT\Media\ringout.wav", "C:\WINNT\Media\ringout.wav", "f:\temp.wav"
End Sub
Private Function getWavHead(strFileName As String) As WaveHead
'獲取文件頭
Dim iFreeFile
iFreeFile = FreeFile()
On Error GoTo ErrHandle
Dim MyHead As WaveHead
Open strFileName For Binary As #iFreeFile
Get #iFreeFile, , MyHead
Close #iFreeFile
getWavHead = MyHead
ErrHandle:
End Function
Public Function LinkWav(strFileName1 As String, strFileName2 As String, strOutFile As String) As Boolean
Dim headFirst As WaveHead
Dim headNext As WaveHead
Dim headNew As WaveHead '新文件的頭
Dim Data1() As Byte
Dim Data2() As Byte
Dim i As Long
LinkWav = False
'獲取頭
headFirst = getWavHead(strFileName1)
headNext = getWavHead(strFileName2)
'文件頭比較
DoEvents '這里應該對兩個頭作比較,如果采樣率,聲道數(shù)等等不一致的話不能進行連接
'偶就偷懶不做這個校驗啦,如果要實際應用千萬要完成這一塊的代碼
'創(chuàng)建新頭
headNew = headFirst '先拷貝一個頭過來
headNew.lngFileLen = headFirst.lngDataLenth + headNext.lngDataLenth + 37
'文件長度等于兩個文件的數(shù)據(jù)長度相加再加上頭的長度,為什么是37呢?我也不明白!頭的總長度是44,去掉4個字節(jié)的riff標志和4個字節(jié)的文件長度也應該是36哇。可是你打開一個wav文件把文件長度字段減去數(shù)據(jù)長度字段,就是活見鬼的37。我想了好久總想不通最后妥協(xié)直接寫了個37在這里!:(
headNew.lngDataLenth = headFirst.lngDataLenth + headNext.lngDataLenth
'數(shù)據(jù)段的長度就是兩個文件的數(shù)據(jù)相加啦
'下面是文件操作,為了加快編碼速度減少腦細胞損傷,下面的代碼效率很低,大家自己優(yōu)化啦,如果直接用下面的代碼勸大家不要讀太大的文件,很夠嗆哦~~
'把兩個文件的數(shù)據(jù)讀出來!!
ReDim Data1(headFirst.lngDataLenth - 1)
'Open strFileName1 For Random As #1 Len = 1
Open strFileName1 For Binary As #1
For i = 0 To headFirst.lngDataLenth - 1
Get #1, 45 + i, Data1(i)
Next
Close #1
ReDim Data2(headNext.lngDataLenth - 1)
'Open strFileName2 For Random As #1 Len = 1
Open strFileName2 For Binary As #1 'Len = 1
For i = 0 To headNext.lngDataLenth - 1
Get #1, 45 + i, Data2(i)
Next
Close #1
'開始寫數(shù)據(jù)啦
'Open strOutFile For Random As #1 Len = 1
Open strOutFile For Binary As #1
Put #1, , headNew ' 將頭寫入文件中。
'Close #1
'Open strOutFile For Random As #1 Len = 1
For i = 0 To UBound(Data1)
Put #1, 45 + i, Data1(i) ' 將第一個記錄寫入文件中。
Next
For i = 0 To UBound(Data2)
Put #1, , Data2(i) ' 將第一個記錄寫入文件中。
Next
Close #1 ' 關閉文件。
End Function
'合并兩個WAV聲音文件
Public Function WavMerge(Wave1() As Byte, Wave2() As Byte) As Variant
Dim xx As Long
Dim Y$
'1,確定data chunk的起始點(不同的WAV文件可能會不盡相同)
Do While Y$ "data"
Y$ = Chr(Wave1(xx)) Chr(Wave1(xx + 1)) Chr(Wave1(xx + 2)) Chr(Wave1(xx + 3))
xx = xx + 1
If xx 1000 Then
MsgBox "未知格式"
Exit Function
End If
Loop
Datapos1 = (xx - 1) + 8
xx = 0
Y$ = ""
Do While Y$ "data"
Y$ = Chr(Wave2(xx)) Chr(Wave2(xx + 1)) Chr(Wave2(xx + 2)) Chr(Wave2(xx + 3))
xx = xx + 1
If xx 1000 Then
MsgBox "未知格式"
Exit Function
End If
Loop
Datapos2 = (xx - 1) + 8
xx = 0
Y$ = ""
'2,確定第一個參數(shù)Wave1聲音中是否包含可選的fact chunk
factpos = 0
Do While Y$ "fact"
Y$ = Chr(Wave1(xx)) Chr(Wave1(xx + 1)) Chr(Wave1(xx + 2)) Chr(Wave1(xx + 3))
xx = xx + 1
If xx 1000 Then
xx = 0
Exit Do
End If
Loop
factpos = xx - 1
If factpos = -1 Then factpos = 36
DataLenOut = UBound(Wave1) + 1 - Datapos1 + UBound(Wave2) + 1 - Datapos2
ReDim WAVBuffer(factpos + 19 + DataLenOut)
'3,寫入合并后的RIFF('wave'...fmt...[fact]...頭信息
RtlMoveMemory WAVBuffer(0), Wave1(0), factpos '注:采樣速率,平均數(shù)據(jù)速率,采樣大小,聲道以Wave1參數(shù)為準
WAVBuffer(factpos) = Asc("f"): WAVBuffer(factpos + 1) = Asc("a")
WAVBuffer(factpos + 2) = Asc("c"): WAVBuffer(factpos + 3) = Asc("t")
ChunkLen = 4
RtlMoveMemory WAVBuffer(factpos + 4), ChunkLen, 4
RtlMoveMemory WAVBuffer(factpos + 8), DataLenOut, 4
WAVBuffer(factpos + 12) = Asc("d"): WAVBuffer(factpos + 13) = Asc("a")
WAVBuffer(factpos + 14) = Asc("t"): WAVBuffer(factpos + 15) = Asc("a")
RtlMoveMemory WAVBuffer(factpos + 16), DataLenOut, 4
'4,寫入合并后的data chunk(即所有的samples,先Wave1,后Wave2)
RtlMoveMemory WAVBuffer(factpos + 20), Wave1(Datapos1), UBound(Wave1) - Datapos1 + 1
RtlMoveMemory WAVBuffer(factpos + 20 + UBound(Wave1) - Datapos1 + 1), Wave2(Datapos2), UBound(Wave2) - Datapos2 + 1
'5,更正RIFF頭信息
ChunkLen = UBound(WAVBuffer) - 7
RtlMoveMemory WAVBuffer(4), ChunkLen, 4
'6,結束
WavMerge = WAVBuffer
End Function
'合并多個文件
Public Function f_LinkWav(cFile As Collection, sOutFile As String) As Boolean
Dim headFirst As WaveHead
Dim headNext As WaveHead
Dim headNew As WaveHead '新文件的頭
Dim byteData() As Byte
Dim iFreeFile As Integer
Dim i As Long
Dim j As Long
Dim iA
Dim lData As Long
f_LinkWav = False
iFreeFile = FreeFile()
'獲取頭
headFirst = getWavHead(cFile(1))
lData = headFirst.lngDataLenth - 1
ReDim Preserve byteData(lData)
'Open strFileName1 For Random As #1 Len = 1
Open cFile(1) For Binary As #iFreeFile
For i = 0 To lData
Get #iFreeFile, 45 + i, byteData(i)
Next
Close #iFreeFile
headNew = headFirst
headNew.lngFileLen = headFirst.lngDataLenth
headNew.lngDataLenth = headFirst.lngDataLenth
For iA = 2 To cFile.Count
headNext = getWavHead(cFile(iA))
headNew.lngFileLen = headNew.lngFileLen + headNext.lngDataLenth + 37
headNew.lngDataLenth = headNew.lngDataLenth + headNext.lngDataLenth
ReDim Preserve byteData(lData + headNext.lngDataLenth)
Open cFile(iA) For Binary As #iFreeFile 'Len = 1
For i = 1 To headNext.lngDataLenth
Get #iFreeFile, 44 + i, byteData(lData + i)
Next
Close #iFreeFile
lData = lData + headNext.lngDataLenth
Next
'開始寫數(shù)據(jù)啦
'Open strOutFile For Random As #1 Len = 1
If Dir(sOutFile, vbNormal) "" Then Kill sOutFile
Open sOutFile For Random As #iFreeFile
Put #iFreeFile, , headNew ' 將頭寫入文件中。
Close #iFreeFile
j = UBound(byteData) + 1
'For iA = 2 To giCalltimes
' ReDim Preserve byteData(UBound(byteData) + j)
' For i = 0 To j - 1
' byteData(j + i) = byteData(i) ' 將第一個記錄寫入文件中。
' Next
'Next iA
Open sOutFile For Random As #iFreeFile Len = 1
For i = 0 To UBound(byteData)
Put #iFreeFile, 45 + i, byteData(i) ' 將第一個記錄寫入文件中。
Next
' j = UBound(byteData)
'For iA = 2 To giCalltimes
' For i = 0 To UBound(byteData)
' Put #iFreeFile, 45 + i + j + 1, byteData(i) ' 將第一個記錄寫入文件中。
' Next
' j = j + UBound(byteData)
'Next
Close #iFreeFile ' 關閉文件。
f_LinkWav = True
End Function
Public Function f_MciChkEnd()
Dim MCIStatus As String * 255
Dim lA
f_MciChkEnd = False
lA = mciSendString("status wav mode", MCIStatus, Len(MCIStatus), 0)
If UCase(Left$(MCIStatus, 7)) = "STOPPED" Or Left$(MCIStatus, 2) = "結束" Then f_MciChkEnd = True
End Function
Public Function SendComReturnString(com As String) As String
Dim FeedBack As Long, ReturnString As String * 255
ReturnString = String(255, Chr(0))
FeedBack = mciSendString(com, ReturnString, 255, 0)
If FeedBack Then
Dim s As String * 255
'mciGetErrorString FeedBack, s, 255
SendComReturnString = vbNullString
Else
SendComReturnString = Left(ReturnString, InStr(1, ReturnString, Chr(0)) - 1)
End If
End Function
方法一:調(diào)用系統(tǒng)DLL(這個有點不完善,也就是播放聲音時窗體無法控制,效果相當于Enabled=true,但音頻播放完畢后就沒事了)
Private?Declare?Function?sndPlaySound?Lib?"Winmm.dll"?Alias?"sndPlaySoundA"?(ByVal?lpszSoundName?As?String,?ByVal?uFlags?As?Long)?As?Long
Private?Sub?Button1_Click(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?Button1.Click
Dim?SoundFile?As?String,?Result?As?Long
SoundFile?=?"D:\KuGou\Pianoboy?-?第105天.wav"?'此處為路徑
Result?=?sndPlaySound(SoundFile,?0)
End?Sub
方法二:使用WindowsMediaPlayer(WindowsMediaPlayer1的可見為False)
先添加一個windowsmediaplayer控件(工具箱里沒有,需要手動添加)
Private?Sub?Button1_Click(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?Button1.Click
WindowsMediaPlayer1.visible=False
Me.WindowsMediaPlayer1.URL?=?"D:\KuGou\Pianoboy?-?第105天.mp3"
End?Sub
上面的都是點擊button1(按鈕1)后播放聲音,若是鼠標移動到某控件上發(fā)出聲音的話改一下觸發(fā)事件就OK了。
本文題目:.netvb播放提示音的簡單介紹
分享網(wǎng)址:http://chinadenli.net/article36/hpiopg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供Google、用戶體驗、微信小程序、電子商務、、域名注冊
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)