如何将VB.Net或C#中的Microsoft.Speech识别器的输入音频设备设置为任何音频设备

时间:2017-04-05 22:25:11

标签: vb.net speech-recognition speech sapi audio-device

我想在VB.NET中使用Microsoft.Speech命名空间来创建电话应用程序。我需要能够将识别器输入设置为系统上安装的任何音频设备。 Microsoft有识别器.SetInputToDefaultAudioDevice()方法,但我需要类似.SetInputToAudioDeviceID的东西。如何从系统上安装的设备列表中选择另一个波形音频输入?在SAPI中,我会使用MMSystem和SpVoice:

Set MMSysAudioIn1 = New SpMMAudioIn   
MMSysAudioIn1.DeviceId = WindowsAudioDeviceID  'set audio input to audio device Id
MMSysAudioIn1.Format.Type = SAFT11kHz8BitMono  'set wave format, change to 8kHz, 16bit mono for other devices
Dim fmt As New SpeechAudioFormatInfo(1000, AudioBitsPerSample.Eight, AudioChannel.Mono)
Recognizer.SetInputToAudioStream(MMSysAudioIN1, fmt)

如何使用Microsoft.Speech执行此操作?

更多信息:我想在Windows驱动程序列表和我们中使用任何波形输入设备作为语音识别的输入。具体来说,我可能有一张带有波形输入的Dialogic卡,由TAPI报告为deviceID 1-4。在SAPI中,我可以使用SpMMAudioIn类创建流并设置与该流关联的设备ID。您可以在上面看到一些代码。我可以直接在设备的设备ID上设置Recognizer1.SetInputToAudioStream,就像我在SAPI中一样吗?或者我必须创建读取字节和使用缓冲区等的代码。我是否必须创建一个MemoryStream对象?我无法在任何地方找到任何示例代码。我有什么办法在.NET中检查以获取对ISpeechMMSysAudio / spMMAudioIn的访问权限,以防这样的事情有效?但希望有一种方法可以使用MemoryStream或类似的东西来获取设备ID并允许我将该流传递给识别器。

注意2:我在VB项目中添加了“import Speechlib”,然后尝试运行以下代码。它给出了以下注释中列出的关于无法将音频流设置为COM对象的错误。

Dim sre As New SpeechRecognitionEngine
Dim fmt As New SpeechAudioFormatInfo(8000, AudioBitsPerSample.Sixteen, AudioChannel.Mono)
Dim audiosource As ISpeechMMSysAudio
audiosource = New SpMMAudioIn
audiosource.DeviceId = WindowsAudioDeviceID  'set audio input to audio device Id
' audiosource.Format.Type = SpeechAudioFormatType.SAFT11kHz16BitMono 
sre.SetInputToAudioStream(audiosource, fmt) <----- Invalid Cast with COM here

SpeechAudioFormatType似乎也不支持8kHz格式。这变得越来越复杂。

1 个答案:

答案 0 :(得分:0)

您将使用SpeechRecognitionEngine.SetInputToAudioStream。请注意,如果您遇到流式输入问题,则可能需要打包流,如图here所示。