Распознавание речи происходит слишком медленно с помощью SAPI SDK 11 в Visual Studio
Я пробовал VB в Visual Studio 2010 и 2012 с фреймворком 4.5. После установки Speech SDK versionn 11 я проверяю "Библиотеку объектов Microsoft Speech версии 11". Затем я импортирую "SpeechLib" и создаю экземпляр речи с помощью:
Public WithEvents m_Recocontext As SpInProcRecoContext
Public m_Recognizer As SpInprocRecognizer
Public m_Grammar As ISpeechRecoGrammar
и в Form_Load:
m_Recocontext = New SpInProcRecoContext
m_Recognizer = CType(m_Recocontext.Recognizer, SpInprocRecognizer)
m_Grammar = m_Recocontext.CreateGrammar(0)
Dim grammarfile As String = Application.StartupPath & "\grammartest.xml"
m_Grammar.CmdLoadFromFile(grammarfile, SpeechLoadOption.SLODynamic)
m_Recocontext.EventInterests = SpeechRecoEvents.SREAllEvents
m_Recocontext.RetainedAudio = CType((m_Recocontext.RetainedAudio = SpeechRetainedAudioOptions.SRAORetainAudio), SpeechRetainedAudioOptions)
Затем в своей процедуре "SpeechOn" я подключаю аудиотракт к своему телефонному устройству по телефону:
m_AudioIn = New SpMMAudioIn
m_AudioIn.DeviceId = TelePhoneLine.WaveRecordID
m_AudioIn.Format.Type = SpeechAudioFormatType.SAFT8kHz16BitMono
m_Recognizer.AudioInputStream = m_AudioIn
m_Grammar.CmdSetRuleIdState(1, SpeechRuleState.SGDSActive)
Вот мой файл грамматики:
<GRAMMAR LANGID="409">
<RULE ID="1" Name="number" TOPLEVEL="ACTIVE">
<L PROPNAME="number">
<P VAL="1">+one</P>
<P VAL="2">+two</P>
<P VAL="3">+three</P>
<P VAL="4">+four</P>
<P VAL="5">+five</P>
<P VAL="6">+six</P>
<P VAL="7">+seven</P>
<P VAL="8">+eight</P>
<P VAL="9">+nine</P>
<P VAL="0">+zero</P>
</L>
</RULE>
<RULE ID="2" Name="yesno" TOPLEVEL="ACTIVE">
<L PROPNAME="yesno">
<P VAL="1">+yes</P>
<P VAL="2">+no</P>
<P VAL="3">+maybe</P>
</L>
</RULE>
</GRAMMAR>
Мое событие "OnRecognition" срабатывает каждый раз, когда я произношу командное и управляющее слово из моего файла грамматики.XML, который очень мал, обычно всего 0-9 или даже просто 1 или 2 (нажмите 1 для да и 2 для нет). Если я говорю "1...2...3...4...5" в обычном темпе, он пропускает все остальные номера или каждое третье число. Если я говорю 1 номер в секунду, он получает их все. Какой трюк мне не хватает, чтобы сделать распознавание речи достаточно быстрым, чтобы его можно было использовать?
И вот окончательная рабочая версия. "propname" нужно было добавить в тег, иначе он не будет загружаться.
<GRAMMAR LANGID="409">
<RULE ID="1" Name="number" TOPLEVEL="ACTIVE">
<PHRASE min="5" max="7">
<RULEREF Name="digits" propname="digits"/>
</PHRASE>
</RULE>
<RULE Name="digits">
<L PROPNAME="digits">
<P VAL="0">0</P>
<P VAL="1">1</P>
<P VAL="2">2</P>
<P VAL="3">3</P>
<P VAL="4">4</P>
<P VAL="5">5</P>
<P VAL="6">6</P>
<P VAL="7">7</P>
<P VAL="8">8</P>
<P VAL="9">9</P>
</L>
</RULE>
</GRAMMAR>
1 ответ
Вы захотите изменить свои грамматики (используя спецификацию SAPI Grammar), чтобы указать номер счета. Предполагая, что номера вашего счета 7-10 цифр, вы можете использовать что-то вроде этого:
<rule name="accountno">
<phrase min="7" max="10">
<ruleref name="digit" propname="digit"/>
</phrase>
</rule>
<rule name="digit">
<l>
<p val="0">0</p>
<p val="1">1</p>
<p val="2">2</p>
<p val="3">3</p>
<p val="4">4</p>
<p val="5">5</p>
<p val="6">6</p>
<p val="7">7</p>
<p val="8">8</p>
<p val="9">9</p>
</l>
</rule>