注册 登录
编程论坛 VFP论坛

哪位大神帮我把这段语音转文字的VBS代码翻成VFP的,谢谢!

jlliushi 发布于 2021-12-28 07:25, 2701 次点击
下面是VBS代码的语音识别程序,哪位大神帮我把这段代码翻成VFP的,谢谢!
'VBS语音识别程序
Dim ScriptComplete '程序结束标志
Dim SR '语音识别(Speech Recognition)对象
Dim Grammar '语音识别的命令语法对象
'初始化命令字典对象,可根据自己的需要添加命令
Set WshShell = CreateObject("WScript.Shell") '创建WshShell对象
ScriptComplete = False '初始化程序结束标志
'创建语音识别对象,调用由"Command.XML"所定义的语法,并启动语音识别引擎
Set SR = WScript.CreateObject("SAPI.SpSharedRecoContext", "RecoContext_")
Set Grammar = SR.CreateGrammar
Grammar.CmdLoadFromFile "Command.xml", 0
Grammar.CmdSetRuleIdState 0, 1
'等候你的语音命令(需要安装麦克风),当识别出"命令结束"命令时程序结束
Do
   WScript.Sleep 1000
Loop Until ScriptComplete
'语音命令被识别
Sub RecoContext_Recognition(ByVal StreamNumber,ByVal StreamPosition,ByVal RecognitionType,ByVal Result )
    Text = Result.PhraseInfo.GetText '获取语音识别引擎所识别的命令
    If Text <> "命令结束" Then
       MsgBox Text
     Else
       ScriptComplete = true '程序结束标志
    End If  
End Sub
14 回复
#2
吹水佬2021-12-28 09:40
只看明这几句
SR = CreateObject("SAPI.SpSharedRecoContext", "RecoContext_")
Grammar = SR.CreateGrammar
Grammar.CmdLoadFromFile("Command.xml", 0)
Grammar.CmdSetRuleIdState(0, 1)
INKEY(1)
其他的不清楚做什么、用在哪
#3
jlliushi2021-12-28 09:49
回复 2楼 吹水佬
inkey(1)是等待1秒,让用户键盘输入。
而本任务要等待的是:
SAPI中的ISpeechRecoContext(事件)
Recognition事件:当SR引擎产生一个识别时发生;
它被作为语音识别中最重要的一个事件,因为它返回一次成功识别的结果。一次成功的识别就是一个单词或者短语满足识别上下文的的开发语法的要求或者语音质量满足最低信任值。如果上述两点都不符合,引擎将会返回FalseRecognition事件。被发音的内容不满足信任值有很多原因,如背景干扰、不清晰语音、不常用单词或短语。
结果成员中包括识别结果对象,并且从这些可以得出更多关于语音的信息。

不知道这个事件在VFP中怎么写...


[此贴子已经被作者于2021-12-28 09:58编辑过]

#4
吹水佬2021-12-28 09:56
回复 3楼 jlliushi
没玩过语音的东西,电脑也没有咪头。
既然是COM的东西,应该可以封装成VFP的类,重载属性、方法和事件
#5
jlliushi2021-12-28 10:07
回复 4楼 吹水佬
这个博客里有4篇介绍SAPI的博文,可惜我看不太懂,您看能不能把那个事件移植到VFP里写。。。
https://

就是不知道这个事件在VFP里怎么写
Sub RecoContext_Recognition(ByVal StreamNumber,ByVal StreamPosition,ByVal RecognitionType,ByVal Result )     '如果语音命令被识别时发生
    。。。。
End Sub

[此贴子已经被作者于2021-12-28 10:11编辑过]

#6
吹水佬2021-12-28 19:39
回复 5楼 jlliushi
看了一下 sapi.dll
SpSharedRecoContext的事件接口大概意思一下,没有声音设备测试不了,有些事件入口参数数据类型还没测试确定。
程序代码:
sr = CreateObject("SAPI.SpSharedRecoContext")
srEvent = CREATEOBJECT("srEvents")
EVENTHANDLER(sr, srEvent)
Grammar = sr.CreateGrammar
**Grammar.CmdLoadFromFile("Command.xml", 0)
**Grammar.CmdSetRuleIdState(0, 1)
INKEY(1)
RETURN

DEFINE CLASS srEvents AS session OLEPUBLIC
    IMPLEMENTS _ISpeechRecoContextEvents IN "SAPI.SpSharedRecoContext"
    PROCEDURE _ISpeechRecoContextEvents_Adaptation(StreamNumber as NUMBER, StreamPosition as VARIANT) as VOID
        ? 1
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_AudioLevel(StreamNumber as NUMBER, StreamPosition as VARIANT, AudioLevel as NUMBER) as VOID
        ? 2
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_Bookmark(StreamNumber as NUMBER, StreamPosition as VARIANT, BookmarkId as VARIANT, Options as NUMBER) as VOID
        ? 3
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_EndStream(StreamNumber as NUMBER, StreamPosition as VARIANT, StreamReleased as LOGICAL) as VOID
        ? 4
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_EnginePrivate(StreamNumber as NUMBER, StreamPosition as VARIANT, EngineData as VARIANT) as VOID
        ? 5
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_FalseRecognition(StreamNumber as NUMBER, StreamPosition as VARIANT, Result as OBJECT) as VOID
        ? 6
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_Hypothesis(StreamNumber as NUMBER, StreamPosition as VARIANT, Result as OBJECT) as VOID
        ? 7
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_Interference(StreamNumber as NUMBER, StreamPosition as VARIANT, Interference as OBJECT) as VOID
        ? 8
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_PhraseStart(StreamNumber as NUMBER, StreamPosition as VARIANT) as VOID
        ? 9
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_PropertyNumberChange(StreamNumber as NUMBER, StreamPosition as VARIANT, PropertyName as STRING, NewNumberValue as NUMBER) as VOID
        ? 10
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_PropertyStringChange(StreamNumber as NUMBER, StreamPosition as VARIANT, PropertyName as STRING, NewStringValue as STRING) as VOID
        ? 11
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_Recognition(StreamNumber as NUMBER, StreamPosition as VARIANT, RecognitionType as NUMBER, Result as OBJECT) as VOID
        ? 12
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_RecognitionForOtherContext(StreamNumber as NUMBER, StreamPosition as VARIANT) as VOID
        ? 13
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_RecognizerStateChange(StreamNumber as NUMBER, StreamPosition as VARIANT, NewState as NUMBER) as VOID
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_RequestUI(StreamNumber as NUMBER, StreamPosition as VARIANT, UIType as STRING) as VOID
        ? 14
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_SoundEnd(StreamNumber as NUMBER, StreamPosition as VARIANT) as VOID
        ? 15
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_SoundEnd(StreamNumber as NUMBER, StreamPosition as VARIANT) as VOID
        ? 16
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_SoundStart(StreamNumber as NUMBER, StreamPosition as VARIANT) as VOID
        ? 17
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_StartStream(StreamNumber as NUMBER, StreamPosition as VARIANT) as VOID
        ? 18
    ENDPROC
ENDDEFINE

#7
cjc10102021-12-29 16:43
按我的理解:Recognition事件是控件RecoContext固有的。VB的Sub RecoContext_Recognition(ByVal Result)表示按件RecoContext的Recognition事件里给参数Result赋值。对应的在VFP里,如果要用text1显示Result的值,应该是在控件RecoContext的Recognition事件里写:
LPARAMETERS Result
thisform.text1.value=thisform.RecoContext.Result.PhraseInfo.GetText。试试?

[此贴子已经被作者于2021-12-29 16:44编辑过]

#8
jlliushi2021-12-30 09:05
回复 6楼 吹水佬
出错信息:方法程序或事件不能含有嵌套的过程或类定义。
#9
jlliushi2021-12-30 09:13
回复 7楼 cjc1010
RecoContext不是个控件,是VFP用Set RecoContext = WScript.CreateObject("SAPI.SpSharedRecoContext", "RecoContext_")创建的一个对象;
Recognition是创建的这个对象本身的事件:当Recognition产生一个语音识别时发生,它是语音识别中最重要的一个事件,因为它返回一个成功识别的结果;
现在的问题是,不知道这个事件在VFP中怎么写...
#10
吹水佬2021-12-30 10:23
以下是引用jlliushi在2021-12-30 09:05:03的发言:

出错信息:方法程序或事件不能含有嵌套的过程或类定义。

我这运行下面代码只提示音频设备设置问题(可能是没有音频设备),没见其他异常,也没见触发了哪个事件。
用EVENTHANDLER绑定事件的做法在某些COM控件是有效的,但对SAPI的东西没试过,不知有无效。
程序代码:
sr = CreateObject("SAPI.SpSharedRecoContext")
srEvent = CREATEOBJECT("srEvents")
EVENTHANDLER(sr, srEvent)
Grammar = sr.CreateGrammar
RETURN

DEFINE CLASS srEvents AS session OLEPUBLIC
    IMPLEMENTS _ISpeechRecoContextEvents IN "SAPI.SpSharedRecoContext"
    PROCEDURE _ISpeechRecoContextEvents_Adaptation(StreamNumber as NUMBER, StreamPosition as VARIANT) as VOID
        ? 1
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_AudioLevel(StreamNumber as NUMBER, StreamPosition as VARIANT, AudioLevel as NUMBER) as VOID
        ? 2
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_Bookmark(StreamNumber as NUMBER, StreamPosition as VARIANT, BookmarkId as VARIANT, Options as NUMBER) as VOID
        ? 3
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_EndStream(StreamNumber as NUMBER, StreamPosition as VARIANT, StreamReleased as LOGICAL) as VOID
        ? 4
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_EnginePrivate(StreamNumber as NUMBER, StreamPosition as VARIANT, EngineData as VARIANT) as VOID
        ? 5
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_FalseRecognition(StreamNumber as NUMBER, StreamPosition as VARIANT, Result as OBJECT) as VOID
        ? 6
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_Hypothesis(StreamNumber as NUMBER, StreamPosition as VARIANT, Result as OBJECT) as VOID
        ? 7
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_Interference(StreamNumber as NUMBER, StreamPosition as VARIANT, Interference as OBJECT) as VOID
        ? 8
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_PhraseStart(StreamNumber as NUMBER, StreamPosition as VARIANT) as VOID
        ? 9
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_PropertyNumberChange(StreamNumber as NUMBER, StreamPosition as VARIANT, PropertyName as STRING, NewNumberValue as NUMBER) as VOID
        ? 10
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_PropertyStringChange(StreamNumber as NUMBER, StreamPosition as VARIANT, PropertyName as STRING, NewStringValue as STRING) as VOID
        ? 11
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_Recognition(StreamNumber as NUMBER, StreamPosition as VARIANT, RecognitionType as NUMBER, Result as OBJECT) as VOID
        ? 12
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_RecognitionForOtherContext(StreamNumber as NUMBER, StreamPosition as VARIANT) as VOID
        ? 13
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_RecognizerStateChange(StreamNumber as NUMBER, StreamPosition as VARIANT, NewState as NUMBER) as VOID
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_RequestUI(StreamNumber as NUMBER, StreamPosition as VARIANT, UIType as STRING) as VOID
        ? 14
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_SoundEnd(StreamNumber as NUMBER, StreamPosition as VARIANT) as VOID
        ? 15
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_SoundEnd(StreamNumber as NUMBER, StreamPosition as VARIANT) as VOID
        ? 16
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_SoundStart(StreamNumber as NUMBER, StreamPosition as VARIANT) as VOID
        ? 17
    ENDPROC
    PROCEDURE _ISpeechRecoContextEvents_StartStream(StreamNumber as NUMBER, StreamPosition as VARIANT) as VOID
        ? 18
    ENDPROC
ENDDEFINE
#11
吹水佬2021-12-30 10:30
给个示例
VFP与高级COM组件事件绑定
VFP的 EVENTHANDLER 命令允许绑定一个 COM 服务程序事件到一个VFP对象上被实现接口的方法
例:VFP绑定MSScriptControl库的ScriptControl对象事件Error和Timeout
操作过程:
1、打开VFP的对象浏览器
2、打开类型库,在COM库页选择 Microsoft Script Control 1.0
3、在“类和成员”列表的“接口”点击 DScriptControlSource,右边“使用该接口的类”看到ScriptControl
4、在“类和成员”列表的“类”点击 ScriptControl,右边“事件”看到Error、Timeout
5、分别点击 Error 和 Timeout,下边信息框看到:
     事件 Error() 为 空的
     事件 Timeout() 为 空的
两个事件函数无入口参数,返回值“空”值(无定义返回值)

指定数据类型可参考 DIMENSION 命令的 AS cType 说明

下面代码会触发 Error 事件
程序代码:
TEXT TO cCode TEXTMERGE NOSHOW PRETEXT 7
    function fun()
    {
        return 123+a;
    }
ENDTEXT  
sc = CREATEOBJECT("ScriptControl")
et = CREATEOBJECT("myEvents")
EVENTHANDLER(sc, et)
sc.Language = "JavaScript"
sc.AddCode(cCode)
? sc.Run("fun")
RETURN

DEFINE CLASS myEvents AS session OLEPUBLIC
    IMPLEMENTS DScriptControlSource IN "ScriptControl"
    PROCEDURE DScriptControlSource_Error() as VOID
        ? "触发Error事件"
    ENDPROC
    PROCEDURE DScriptControlSource_Timeout() as VOID
        ? "触发Timeout事件"
    ENDPROC   
ENDDEFINE



#12
吹水佬2021-12-30 10:42
SAPI的sapi.dll存放在 C:\Windows\System32\Speech\Common\sapi.dll
可在VFP的对象浏览器的COM库页“浏览..”
只有本站会员才能查看附件,请 登录
#13
吹水佬2021-12-31 19:02
SAPI.SpSharedRecoContext 没设备测试不了
测试了一下 SAPI.SpVoice 是可行的
程序代码:
sv = CREATEOBJECT("SAPI.SpVoice")
svEvent = CREATEOBJECT("mySvEvents")
EVENTHANDLER(sv, svEvent)
sv.speak("Hello World", 1)  && 异步
MESSAGEBOX("结束......")
RETURN

DEFINE CLASS mySvEvents AS session OLEPUBLIC
    IMPLEMENTS _ISpeechVoiceEvents IN "SAPI.SpVoice"
    PROCEDURE _ISpeechVoiceEvents_AudioLevel(StreamNumber, StreamPosition, AudioLevel)
        ? "AudioLevel"
    ENDPROC
    PROCEDURE _ISpeechVoiceEvents_Bookmark(StreamNumber, StreamPosition, Bookmark, BookmarkId)
        ? "Bookmark"
    ENDPROC
    PROCEDURE _ISpeechVoiceEvents_EndStream(StreamNumber, StreamPosition)
        ? "EndStream"
    ENDPROC
    PROCEDURE _ISpeechVoiceEvents_EnginePrivate(StreamNumber, StreamPosition, EngineData)
        ? "EnginePrivate"
    ENDPROC
    PROCEDURE _ISpeechVoiceEvents_Phoneme(StreamNumber, StreamPosition, Duration, NextPhoneId, Feature, CurrentPhoneId)
        ? "Phoneme"
    ENDPROC
    PROCEDURE _ISpeechVoiceEvents_Sentence(StreamNumber, StreamPosition, CharacterPosition, Length)
        ? "Sentence"
    ENDPROC
    PROCEDURE _ISpeechVoiceEvents_StartStream(StreamNumber, StreamPosition)
        ? "StartStream"
    ENDPROC
    PROCEDURE _ISpeechVoiceEvents_Viseme(StreamNumber, StreamPosition, Duration, NextVisemeId, Feature, CurrentVisemeId)
        ? "Viseme"
    ENDPROC
    PROCEDURE _ISpeechVoiceEvents_VoiceChange(StreamNumber, StreamPosition, VoiceObjectToken)
        ? "VoiceChange"
    ENDPROC
    PROCEDURE _ISpeechVoiceEvents_Word(StreamNumber, StreamPosition, CharacterPosition, Length)
        ? "Word"
    ENDPROC
ENDDEFINE

#14
jlliushi2022-01-01 07:12
回复 10楼 吹水佬
问题已自己解决,谢谢!
#15
cjc10102022-01-01 16:04
请给我们说说怎么解决的?
1