英文:
Is it possible to use UWP's Windows.Media.SpeechRecognition in a .NET project?
问题
我想在普通的.NET或.NET框架(控制台)桌面项目中使用Windows.Media.SpeechRecognition.SpeechRecognizer
。这是否有可能?以下是我尝试但未成功的方法:
- 使用UwpDesktop来使上述程序集被识别。
- 创建一个Windows Runtime组件VS项目,公开一个SpeechRecognizer接口。然而,在.NET项目中尝试使用它会导致
System.PlatformNotSupportedException
。
还有其他方法吗?如果没有,是否有一种常规的IPC方法可以让UWP和普通的.NET应用程序在Windows上通信?
英文:
I'd like to use Windows.Media.SpeechRecognition.SpeechRecognizer
in a normal .NET or .NET framework (console) desktop project. Is this possible at all? Here's what I tried so far without success:
- Using UwpDesktop to get the above assembly recognized.
- Creating a Windows Runtime Component VS project that exposes an interface to SpeechRecognizer. However, trying to use it in a .NET project results in
System.PlatformNotSupportedException
.
What other ways are there? If none, is there a conventional IPC method to make UWP and normal .NET apps talk on Windows?
答案1
得分: 0
如果您想在.NET项目中使用 Windows.Media.SpeechRecognition.SpeechRecognizer
,可以在项目引用中添加 Windows.winmd 和 System.Runtime.WindowsRuntime.dll。
以下是供您参考的文件位置:
C:\Program Files (x86)\Windows Kits\10\UnionMetadata\10.0.16299.0\Windows.winmd
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETCore\v4.5\System.Runtime.WindowsRuntime.dll
更新
我的控制台代码示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.Media.SpeechRecognition;
namespace ConsoleApp1
{
internal class Program
{
static async Task Main(string[] args)
{
var recognizer = new SpeechRecognizer();
await recognizer.CompileConstraintsAsync();
recognizer.Timeouts.InitialSilenceTimeout = TimeSpan.FromSeconds(5);
recognizer.Timeouts.EndSilenceTimeout = TimeSpan.FromSeconds(20);
recognizer.UIOptions.AudiblePrompt = "Say whatever you like, I'm listening";
recognizer.UIOptions.ExampleText = "This is a sample Test";
recognizer.UIOptions.ShowConfirmation = true;
recognizer.UIOptions.IsReadBackEnabled = true;
recognizer.Timeouts.BabbleTimeout = TimeSpan.FromSeconds(5);
var result = await recognizer.RecognizeWithUIAsync();
if (result != null)
{
StringBuilder builder = new StringBuilder();
builder.AppendLine($"I have {result.Confidence} confidence that you said [ {result.Text}] " + $"and it took {result.PhraseDuration.TotalSeconds} seconds to say it " + $"starting at {result.PhraseStartTime:g}");
var alternates = result.GetAlternates(10);
builder.AppendLine($"There were {alternates?.Count} alternates - listed below (if any)");
if (alternates != null)
{
foreach (var alternate in alternates)
{
builder.AppendLine($"Alternate {alternate.Confidence} confident you said [ {alternate.Text}]");
}
}
}
}
}
}
<details>
<summary>英文:</summary>
If you want to use `Windows.Media.SpeechRecognition.SpeechRecognizer` in .NET project, you can add **Windows.winmd** and **System.Runtime.WindowsRuntime.dll** in the project References.
Here is my file location for your reference.
C:\Program Files (x86)\Windows Kits\UnionMetadata.0.16299.0\Windows.winmd
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5\ystem.Runtime.WindowsRuntime.dll
----------
### Update
My console code sample
[![enter image description here][1]][1]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.Media.SpeechRecognition;
namespace ConsoleApp1
{
internal class Program
{
static async Task Main(string[] args)
{
var recognizer = new SpeechRecognizer();
await recognizer.CompileConstraintsAsync();
recognizer.Timeouts.InitialSilenceTimeout = TimeSpan.FromSeconds(5);
recognizer.Timeouts.EndSilenceTimeout = TimeSpan.FromSeconds(20);
recognizer.UIOptions.AudiblePrompt = "Say whatever you like, I'm listening";
recognizer.UIOptions.ExampleText = "This a sample Test";
recognizer.UIOptions.ShowConfirmation = true;
recognizer.UIOptions.IsReadBackEnabled = true;
recognizer.Timeouts.BabbleTimeout = TimeSpan.FromSeconds(5);
var result = await recognizer.RecognizeWithUIAsync();
if (result != null)
{
StringBuilder builder = new StringBuilder();
builder.AppendLine($"I have {result.Confidence} confidence that you said [ {result.Text}] " + $"and it took {result.PhraseDuration.TotalSeconds} seconds to say it " + $"starting at {result.PhraseStartTime:g}");
var alternates = result.GetAlternates(10);
builder.AppendLine($"There were {alternates?.Count} alternates - listed below (if any)");
if (alternates != null)
{
foreach (var alternate in alternates)
{
builder.AppendLine($"Alternate {alternate.Confidence} confident you said [ {alternate.Text}]");
}
}
}
}
}
}
[1]: https://i.stack.imgur.com/dPcqZ.png
</details>
# 答案2
**得分**: 0
添加 `Microsoft.Windows.SDK.Contracts` NuGet 包是使其在常规的 .NET 控制台应用程序中正常工作所需的。您还需要使用包引用格式。
但仍然存在一些问题,例如在以管理员模式运行时初始化失败,以及窗口失去焦点后永久停止监听语音。但我认为这些是单独的问题。
<details>
<summary>英文:</summary>
Turns out adding `Microsoft.Windows.SDK.Contracts` NuGet package was what was needed to make it work in a regular .NET console application. You also need to use package reference format.
There are still some issues, though, like it failing to initialize when run in admin mode, and permanently stopping to listen to voice once the window goes out of focus. But I'd consider these as separate issue.
</details>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论