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

如何将VB.Net或C#中Microsoft.Speech Recognitor的输入音频设备设置为任何音频设备,vb.net,speech-recognition,speech,sapi,audio-device,Vb.net,Speech Recognition,Speech,Sapi,Audio Device,我想在VB.NET中使用Microsoft.Speech命名空间来创建电话应用程序。我需要能够将识别器输入设置为系统上安装的任何音频设备。Microsoft有识别器.setInputOdeFaultAudioDevice()方法,但我需要类似.setInputOaudioDeviceID的东西。如何从系统上安装的设备列表中选择另一个wave音频输入?在SAPI中,我将使用彩信系统和SpVoice: Set MMSysAudioIn1 = New SpMMAudioIn MMSysAudio

我想在VB.NET中使用Microsoft.Speech命名空间来创建电话应用程序。我需要能够将识别器输入设置为系统上安装的任何音频设备。Microsoft有识别器.setInputOdeFaultAudioDevice()方法,但我需要类似.setInputOaudioDeviceID的东西。如何从系统上安装的设备列表中选择另一个wave音频输入?在SAPI中,我将使用彩信系统和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 wave驱动程序列表中的任何wave输入设备和我们一起作为语音识别的输入。具体来说,我可能有一个Dialogic卡,其波形输入由TAPI报告为deviceID 1-4。在SAPI中,我可以使用SpMMAudioIn类创建流,并设置与该流关联的设备ID。您可以看到上面的一些代码。我可以像在SAPI中一样,通过设备的设备ID直接设置Recognizer1.setInputOAudioStream吗?或者我必须创建读取字节和使用缓冲区等的代码。我必须创建MemoryStream对象吗?我在任何地方都找不到任何示例代码。如果类似的操作可行,我必须签入.NET才能访问ISpeechMMSysAudio/spmmaudio吗?但希望有一种方法可以使用MemoryStream或类似的东西,它可以获取设备ID并让我将该流传递给识别器

注2:我将“imports Speechlib”添加到VB项目中,然后尝试运行以下代码。它给出了下面评论中列出的关于无法将音频流设置为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
Dim sre作为新的SpeechRecognitionEngine
Dim fmt作为新的SpeechAudioFormatInfo(8000,AudioBitsSperSample.16,AudioChannel.Mono)
将音频源设置为iPeechmmSysaudio
音频源=新的SpMMAudioIn
audiosource.DeviceId=WindowsAudioDeviceID'将音频输入设置为音频设备Id
'audiosource.Format.Type=SpeechAudioFormatType.SAFT11kHz16BitMono

sre.setinputOAudiostream(音频源,fmt)您将使用。请注意,如果流式输入有问题,可能需要包装流,如图所示。

对不起,Eric。我在两条线上跟你说话。如果我可以用一行代码将其设置为默认音频设备,为什么我不能将其设置为任何音频设备的inpu?我仍然不确定如何做到这一点。我找不到任何VB.NET代码(如果我能找到的话,我可能能够转换C#),显示如何获取调制解调器或对话卡、PBX线路等的波形输入的设备ID,并让语音识别使用该输入。没有我可以使用的关于如何使用.setInputOAudioStream的示例。@Fred在System.Speech中,您可以设置为默认音频设备(这通常是您想要的),但在Microsoft.Speech中,您很少想这样做;通常,您希望连接到某个任意设备(调制解调器、对话卡、网络),而这些任意设备的唯一真正共同点是字节流,这最好用System.IO.stream.justice来描述!在SAPI中,我可以使用spMMAudioIn直接将speechrec输入设置为wave设备的设备ID。但我仍然不知道如何使用Dialogic卡和microsoft.speech这样的设备来实现这一点。TAPI将报告我想要的线路的设备ID(lineGetID提供wave/in/out类并填充DeviceID/DeviceOutID)。我拥有的一个控件使用MMSYSTEM的WaveInOpen()并将uDeviceID设置为我从TAPI获取的用于录制的设备ID。因此,当我在通话时,我想将通话中的音频输入发送到识别器。怎么用?我正在阅读System.IO.Stream,但没有理解。我在上面稍微修改了问题,包括不同的代码和问题的更多细节。谢谢我做了一些研究,如果你可以创建一个spmmaudoin对象,你可以将该对象传递给setInputOudioStream。