【问题标题】:Use of SAPI Speech Recognition in a VBS Script?在 VBS 脚本中使用 SAPI 语音识别?
【发布时间】:2014-07-24 12:47:30
【问题描述】:

我发现了这个允许在 VBScript 中使用 Windows SAPI 文本到语音功能的单行示例:

CreateObject("SAPI.SpVoice").Speak("This is a test")

我想知道 SAPI 语音识别是否可以以同样简单的方式在 VBScript 程序中使用。当我寻找此类信息时,出现的大量 SAPI 信息与 C++ 相关,例如 Microsoft SAPI 站点或 VBS 中的文本到语音转换。我试图找到有关可在 VBScript 中使用的 SAPI COM 对象语音识别部分的文档,但没有找到。

你知道这样的文件是否存在吗? TIA

编辑在收到第一个答案后添加的附加请求

虽然下面的第一个答案提供了指向 SAPI COM 对象文档的链接,但我想提醒您注意我的问题中的一点:“我想知道 SAPI 语音识别是否可以在 VBScript 程序中使用 IN同样简单的方法”。 SAPI 文档巨大!我读了几页,我完全迷失了……我的目标是只识别几个单词,比如 8 或 10 个,并且每次识别其中一个单词时都会在屏幕上显示不同的信息;这就对了! (该程序应该是通过cscript 启动的控制台应用程序)。是否有一个 简单 的 VBS 代码示例可以实现这样的事情?如果编写此解决方案所需的代码需要有几页,那么这不是我要寻找的答案...

【问题讨论】:

  • @AnsgarWiechers:我将示例复制粘贴到 test.vbs 文件中的那个链接,通过cscript //nologo test.vbs 执行它并得到这个(等效)错误:“test.vbs(1, 19) Microsoft VBScript 编译器错误:预期指令结束”。我使用的是 Windows 8.1 西班牙文版和 cscript Windows Script Host 5.8 版
  • 我认为您需要对代码进行一些调整,因为它是 VB,而不是 VBScript。后者不支持On Error Goto MARK 之类的东西,您必须将Set RC = New SpSharedRecoContext 形式的对象创建替换为CreateObject() 和完整的组件名称:Set RC = CreateObject("SAPI.SpSharedRecoContext")
  • 从那以后你有什么新发现吗?
  • @Wolf:不,抱歉。我尝试使用所有编译的数据编写一个工作示例,但该程序在 VBS 中不起作用,即在cscript.exe 编译的程序中。有一系列旨在将程序调整到 VBS 环境的更改,但它们从未奏效。为此编写一个 C++ 程序要简单得多...

标签: vbscript speech-recognition sapi


【解决方案1】:

这是一个vbscript 监听 wav 文件的工作示例:

scriptRunning = true

Sub rc_Recognition(StreamNumber, StreamPosition, RecognitionType, Result)
  Wscript.Echo "Reco: ", Result.PhraseInfo.GetText, ".", RecognitionType
End Sub

Sub rc_StartStream(StreamNumber, StreamPosition)
  Wscript.Echo "Start: ", StreamNumber, StreamPosition
End Sub

Sub rc_EndStream(StreamNumber, StreamPosition, StreamReleased)
  Wscript.Echo "End: ", StreamNumber, StreamPosition, StreamReleased
  scriptRunning = false
End Sub


outwav = "C:\SOFT\projects\af2t\t.wav"
Const SAFT22kHz16BitMono = 22
Const SSFMOpenForRead = 0

set sapiFStream = CreateObject("SAPI.SpFileStream")
sapiFStream.Format.Type = SAFT16kHz16BitMono
sapiFStream.Open outwav, SSFMOpenForRead


MsgBox "A SpeechLib::ISpRecoContext object will be created"

Const SGDSActive = 1

Set rct = WScript.CreateObject("SAPI.SpInProcRecoContext", "rc_")
Set rgnz = rct.Recognizer
Set rgnz.AudioInputStream = sapiFStream
Set rcGrammar = rct.CreateGrammar
'rcGrammar.DictationLoad
rcGrammar.DictationSetState SGDSActive
i = 0
while scriptRunning and i < 100
  WScript.Sleep(50)
  i = i + 1
wend

MsgBox "A SpeechLib::ISpRecoContext object has been created"

代码的神奇部分是这一行(“rc_”前缀参数允许事件被子捕获):

Set rct = WScript.CreateObject("SAPI.SpInProcRecoContext", "rc_")

我用于测试的 t.wav 文件中的录制文本是使用 SAPI.SpVoice::Speak 和 MS-David 语音生成的;-)

我花了 10 天时间弄清楚如何编写这个脚本。微软正在删除有关自动化、COM、旧式脚本等的文档。真可惜。

所以,这可以在听写模式下读取 wav 文件。但我无法纠正它以使其在实时听写模式下工作(即使用麦克风作为直接输入)。对此表示赞赏的任何帮助。谢谢。

编辑:直接/实时听写模式已解决。如果有兴趣,我分享 vbscript 代码。

EDIT2: 以 wav 朗读的文本示例:Hello world. This is a talk about gear tooth profile using a circle involute. vbscript 的控制台输出

C:\SOFT\projects\af2t>cscript r.vbs
Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. Tous droits réservés.

Start:  1 0
Reco:  Hello world . 0
Reco:  this is a talk about gear to the profile using a circle invalid . 0
End:  1 195040 -1

C:\SOFT\projects\af2t>

【讨论】:

  • 很高兴阅读它对您有用。如果您还添加了 text-to-wav 部分,那么就有很大的机会为此答案收集积极的回复。提前致谢。
  • @Wolf:您的意思是保存在 wav 文件中的文本转语音?如果您与问题分享链接,我很乐意回答。 OP Aacini 的问题是关于语音到文本的,所以我只是回答了这个问题 ;-)
  • 我明白了。顺便说一句(发现或提出问题需要一些时间):你有没有遇到过文本源中的 unicode 问题?我在尝试输出波兰数字时失败了(波兰语言已成功安装,但 VB 似乎有 utf-8 输入的问题),我对 VB 脚本真的没什么经验...
  • @Wolf :这是一个已回答的 text-to-speech saved to wav file 问题:stackoverflow.com/questions/20498004/…。我习惯了英语和拉丁语,我没有遇到编码问题(还...)。
  • 谢谢 :-) 也许我应该补充一点,我对被告知上面的相反部分不感兴趣(我已经尝试过,因为它更容易),但在这个的自我包含例子。 (IOW,Debug.Assert(text = codec(text))
【解决方案2】:

是的。看SAPI Automation Overview;它会告诉你所有关于 VBScript 可用的后期绑定 COM 接口和对象。

【讨论】:

  • 感谢您的回答。请参阅上面我的问题中的编辑。如果我在合理的时间内没有收到包含附加信息的答案,我会选择这个答案...
  • 您可以将msdn.microsoft.com/en-us/library/ee125181(v=vs.85).aspx 作为起点。仍然包含您不想知道的内容,但是...足够紧凑,可以创建您自己的实验。
  • @ansgar-wiechers 评论是一个很好的起点。 SR 简直比 TTS 更难;你必须定义你在听什么,然后对结果做一些事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-02
  • 1970-01-01
相关资源
最近更新 更多