科大讯飞在线语音识别

来源:互联网 发布:浙江日报撤资淘宝天下 编辑:程序博客网 时间:2024/04/28 16:49
#Const _Debug = 1'录音识别文字  边录边识别#Const _WriteWaveFile = 0Public Class SpeechRecogWav    Dim login_params As String = "appid = *科大讯飞APPID*,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#If _WriteWaveFile Then        Wave.WaveSaveFile("d:\abc" & waveCount.ToString & ".wav")        waveCount += 1#End If        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 IntPtr, 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)  '识别的内容                '   debug.print(tmp)  '*****将导致录音阻塞,致使语音断开,即声音不连续                RaiseEvent WaveTxtEvent(tmp)   '******事件                 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 Event WaveTxtEvent(txt As String)    '第-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)                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)                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 SubEnd Class
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 鬼斗魂 斗魂三国 斗魂手游 斗魂之刃 斗魂txt下载 斗魂大陆第一季 斗魂卫之玄月奇缘免费观看 魔幻陀螺2斗魂觉醒 斗魂大陆 云龙卷狼 至强斗魂杜少甫 禹枫 灌篮之翔阳斗魂 斗魂卫之玄月奇缘第二季 斗魂大陆下载 斗魂大陆之神之子 蝌睡虫 无上斗魂全文 魔幻陀螺2斗魂觉醒破解版 斗魂大陆 枫叶恋秋落 斗武乾坤张陌凡斗魂 逗鱼 dytv 斗魚 鬥魚 douy douyu douyutv doyu 斗鲨 斗鸡论坛 斗鸡眼矫正 斗鸡 斗鸡图片 越南斗鸡 斗鸡菇 河南斗鸡 斗鸡走犬 中国斗鸡 英国斗鸡 斗鸡走狗 功夫斗鸡 斗鸡眼症状 斗鸡苗价格