【问题标题】:How to set the input audio device for Microsoft.Speech recognizer in VB.Net or C# to any audio device如何将 VB.Net 或 C# 中 Microsoft.Speech 识别器的输入音频设备设置为任何音频设备
【发布时间】:2017-08-31 17:51:58
【问题描述】:

我想使用 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 波形驱动程序列表中的任何波形输入设备和我们作为语音识别的输入。具体来说,我可能有一张对话卡,其波形输入由 TAPI 报告为 deviceID 1-4。在 SAPI 中,我可以使用 SpMMAudioIn 类创建一个流并设置与该流关联的设备 ID。你可以看到上面的一些代码。我可以像在 SAPI 中那样通过设备的设备 ID 直接设置 Recognizer1.SetInputToAudioStream 吗?或者我是否必须创建读取字节并使用缓冲区等的代码。我是否必须创建一个 MemoryStream 对象?我在任何地方都找不到任何示例代码。我必须在 .NET 中检查什么才能访问 ISpeechMMSysAudio/spMMAudioIn,以防这样的事情起作用?但希望有一种方法可以使用 MemoryStream 或类似的方法,它接受设备 ID 并让我将该流传递给识别器。

注意 2:我在 VB 项目中添加了“imports Speechlib”,然后尝试运行以下代码。它给出了下面的 cmets 中列出的关于无法将音频流设置为 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 格式。这只会变得越来越复杂。

【问题讨论】:

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


    【解决方案1】:

    您将使用SpeechRecognitionEngine.SetInputToAudioStream。请注意,如果您在流式输入方面遇到问题,您可能需要对流进行包装,如 here 所示。

    【讨论】:

    • 对不起埃里克。我用两个线程和你说话。如果我可以用一行代码将其设置为默认音频设备,为什么我不能将其设置为任何音频设备的输入?我仍然不确定如何做到这一点。我找不到任何显示如何获取调制解调器或对话卡、PBX 线路等的波形输入的设备 ID 并有语音的 VB.NET 代码(如果我能找到,我可以转换 C#)识别使用该输入。没有我可以使用的如何使用 .SetInputToAudioStream 的示例。
    • @Fred 在 System.Speech 中,您可以设置为默认音频设备(这通常是您想要的),但在 Microsoft.Speech 中,您很少想要这样做;通常你想连接到一些任意设备(调制解调器、对话卡、网络),而这些任意设备唯一真正的共同点是字节流,最好用 System.IO.Stream 来描述。
    • 没错!在 SAPI 中,我可以使用 spMMAudioIn 直接将 Speechrec 输入设置为 Wave 设备的 Device ID。但我仍然不知道如何使用 Dialogic 卡和 microsoft.speech 之类的设备来做到这一点。 TAPI 将报告我想要的线路的设备 ID(lineGetID 提供 wave/in/out 类并填充 DeviceInID/DeviceOutID)。我拥有的控件使用 MMSYSTEM 的 WaveInOpen() 并将 uDeviceID 设置为我从 TAPI 获得的用于记录的 DeviceInID。因此,当我在通话时,我想将通话中的音频输入发送到识别器。如何?我正在阅读 System.IO.Stream,但不明白。
    • 我稍微改变了上面的问题,包括不同的代码和我的问题的更多细节。谢谢!
    • 我做了一些研究,如果您可以创建一个 SpMMAudioIn 对象,您可以将该对象传递给 SetInputToAudioStream。
    猜你喜欢
    • 1970-01-01
    • 2011-10-18
    • 2021-09-03
    • 2020-04-11
    • 2011-03-13
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多