科大讯飞 语音识别 VB WIN10 X64 VS2017

若使用C# ,请用CS转VBConverter 工具转换

Imports System.Runtime.InteropServices

Imports System.IO

#Const _Debug = 1

#Const _WriteWaveFile = 0

Public Class SpeechRecogWav

Dim _appid As String

Public Sub New(appid As String)

_appid = appid

End Sub

Const xfAppId = "appid = 599dXXXX" '***************科大讯飞的appid

Dim login_params As String = xfAppId & ",engine_start = ivw,ivw_res_path =fo|res/ivw/wakeupresource.jet, work_dir = ." '//使用唤醒需要在此设置engine_start = ivw,ivw_res_path =fo|xxx/xx 启动唤醒引擎

Dim session_begin_params As String = "sub = iat, domain = iat, language = zh_cn, accent = mandarin, sample_rate = 16000, result_type = plain, result_encoding = gb2312"

' Dim grammar_id As String = vbNullString

Dim Sessionid As String

Public Sub Logoin() '第一步 登录

Dim ret As Integer = 0

ret = MSPLogin(vbNullString, vbNullString, login_params) '第一个参数是用户名,第二个参数是密码,均传NULL即可,第三个参数是登录参数

If (MSP_SUCCESS <> ret) Then 'vbNullString 与vbNull 不同,见

' debug.print(ret)

Debug.Print("speechrecog login error" & ret)

End If

End Sub

#Region "iat 可上传 也可不上传语法 ASR需上传语法进行判断"

'''是否上传语法文件,用户词表

Public Function UpdataGrammar(abnfFile As String) As String '第二步上传语法文件

'// 获取语法ID

Dim fs As New IO.FileStream(abnfFile, IO.FileMode.Open)

Dim ret As Integer = 0

Dim flen As Integer = fs.Length

Dim grammar_len As Integer = fs.Length

Dim buff As Byte()

ReDim buff(flen)

fs.Read(buff, 0, flen)

fs.Close()

ret = -1

Dim ret_id As IntPtr = MSPUploadData("usergram", buff, grammar_len, "dtt = abnf, sub = asr", ret)

Dim grammar_id As String = Marshal.PtrToStringAnsi(ret_id)

Return grammar_id

End Function

'上传用户词表

Public Function UpdataUserWordFile(useWordFile As String) As Integer

Dim fs As New IO.FileStream(useWordFile, IO.FileMode.Open)

Dim ret As Integer = 0

Dim flen As Integer = fs.Length

Dim buff As Byte()

ReDim buff(flen)

fs.Read(buff, 0, flen)

fs.Close()

ret = -1

' 用户词表上传不需要获取GRAMMAR_ID

MSPUploadData("userwords", buff, flen, "sub = uup, dtt = userword", ret) ' //上传用户词表

Return ret

End Function

'上传用户词表

Public Function UpdataUserWord(useWord As String) As Integer

Dim ret As Integer = -1

' 用户词表上传不需要获取GRAMMAR_ID

Dim Bt() As Byte = System.Text.Encoding.ASCII.GetBytes(useWord)

' Bt(useWord.Length - 1) = 0

MSPUploadData("userwords", Bt, Bt.Length, "sub = uup, dtt = userword", ret) ' //上传用户词表

#If _Debug Then

Debug.Print("update userword:" & ret.ToString)

#End If

Return ret

End Function

#End Region

Dim status As AudioStatus

Dim ep_status As EpStatus

Dim rec_status As RecogStatus

Dim rslt_status As RecogStatus

Dim waveCount As Integer = 0

Dim isOnSession As Boolean = False

'开始录音

Public Sub SessionBegin() '第二步 开始对话

If (isOnSession = True) Then

SessionEnd() '结束上次会话

End If

isOnSession = True

status = AudioStatus.ISR_AUDIO_SAMPLE_FIRST '第一次时使用此

ep_status = EpStatus.ISR_EP_LOOKING_FOR_SPEECH

rec_status = RecogStatus.ISR_REC_STATUS_SUCCESS

rslt_status = RecogStatus.ISR_REC_STATUS_SUCCESS

Dim ret As Integer = 0

'开始对话

Dim errorcode2 As Integer = 0

Sessionid = Marshal.PtrToStringAnsi(QISRSessionBegin(vbNullString, session_begin_params, errorcode2)) 'SESSION_BEGIN_PARAMS 而不是 LOGIN

If (errorcode2 <> 0) Then

Debug.Print("**session begin fail: " & errorcode2)

' Sessionid = Marshal.PtrToStringAnsi(QISRSessionBegin(vbNullString, session_begin_params, errorcode2)) 'SESSION_BEGIN_PARAMS 而不是 LOGIN

End If

End Sub

'上传录音数据

Public Function UpdateWave(lpdata As Byte(), datalen As Integer) As Boolean

#If _WriteWaveFile Then

Wave.WaveWriteFile(lpdata, datalen)

#End If

Dim ret As Integer = 0

status = AudioStatus.ISR_AUDIO_SAMPLE_CONTINUE

If (datalen <= 0) Then

Return True

End If

'写入【待识别】语音

ret = QISRAudioWrite(Sessionid, lpdata, datalen, status, ep_status, rec_status)

If (MSP_SUCCESS <> ret) Then

Debug.Print("//audio write error")

isOnSession = False

QISRSessionEnd(Sessionid, String.Empty)

Return False

End If

'检测到结束端点 返回FALSE

If (ep_status = EpStatus.ISR_EP_AFTER_SPEECH) Then

Debug.Print("UPDATAWAVE ISE EP AFTER SPEECH")

Return False

End If

Dim waittime As Integer = 1000

Dim errcode As Integer

'【获取】识别内容

If (rec_status = RecogStatus.ISR_REC_STATUS_SUCCESS) Then

Dim p As IntPtr = QISRGetResult(Sessionid, rslt_status, waittime, errcode)

If (p <> IntPtr.Zero) Then

Dim tmp As String = Marshal.PtrToStringAnsi(p) '识别的内容

'If (Not waveEventCallBack Is Nothing) Then

' waveEventCallBack(1, tmp)

'End If

System.Console.WriteLine("updateWave返回部分结果!:" + tmp)

End If

End If

Threading.Thread.Sleep(200) '模拟人说话时间间隙,10帧的音频长度为200ms

If (ret <> 0) Then

Debug.Print("qisrupdateaudio fail")

Return False

End If

Return True

End Function

'Public Delegate Sub DelgWaveEventCallBackFun(type As Integer, txt As String)

'Public waveEventCallBack As DelgWaveEventCallBackFun

'Public Sub AddWaveEventCallBack(WCB As DelgWaveEventCallBackFun)

' waveEventCallBack = WCB

'End Sub

'第-2步,结束对话

Public Sub SessionEnd()

isOnSession = False

#If _WriteWaveFile Then

Wave.CloseWaveFile()

#End If

' wav.StopRecord()

'写入上传结束标志

status = AudioStatus.ISR_AUDIO_SAMPLE_LAST

Dim errcode As Integer

errcode = QISRAudioWrite(Sessionid, Nothing, 0, status, ep_status, rec_status)

If (errcode <> 0) Then

Debug.Print("**write end fail")

QISRSessionEnd(Sessionid, String.Empty)

Return

End If

Dim waittime As Integer = 1000

'获取识别内容

If (rec_status = RecogStatus.ISR_REC_STATUS_SUCCESS) Then

Dim p As IntPtr = QISRGetResult(Sessionid, rslt_status, waittime, errcode)

If (p <> IntPtr.Zero) Then

Dim tmp As String = Marshal.PtrToStringAnsi(p)

'If (Not waveEventCallBack Is Nothing) Then

' waveEventCallBack(1, tmp)

'End If

' RaiseEvent WaveTxtEvent(tmp) '******事件

System.Console.WriteLine("结束会话返回部分结果!:" + tmp)

End If

End If

Dim loop_count = 0

While (rslt_status <> RecogStatus.ISR_REC_STATUS_SPEECH_COMPLETE And loop_count < 300)

Dim p As IntPtr = QISRGetResult(Sessionid, rslt_status, waittime, errcode)

If (p <> IntPtr.Zero) Then

Dim tmp As String = Marshal.PtrToStringAnsi(p)

'If (Not waveEventCallBack Is Nothing) Then

' If (tmp <> "。") Then

' waveEventCallBack(1, tmp)

' End If

'End If

' RaiseEvent WaveTxtEvent(tmp) '******事件

System.Console.WriteLine("传完音频后返回结果!:" + tmp)

End If

If (errcode <> 0) Then

Debug.Print("end session qisrgetresult " & errcode.ToString)

Exit While

End If

Threading.Thread.Sleep(150)

loop_count = loop_count + 1

End While

'结束对话

QISRSessionEnd(Sessionid, String.Empty)

End Sub

'最后一步 登出

Public Sub Logout()

'登出

MSPLogout()

End Sub

End Class

b623fcef1d1a4a32b90dee72b549d669.jpg

若要使用语音识别,请将APPID ,跟DLL 文件换成你自己的

5359dc851042493da26c21b0ce579972.png

9ed22d8bc6154e15857bbda2ec6a5b54.png

资源地址:https://download.csdn.net/download/qq_39239990/10384854   开源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值