c#中的语音语音

时间:2014-01-07 14:49:26

标签: c# speech-recognition voice speech-to-text

我有一个c#程序可以让我使用我的麦克风,当我说话时,它会发出命令并会回复。例如,当我说“明天天气怎么样?”它将回应明天的天气。

唯一的问题是,我必须输入我想说的每个短语并预先记录下来。因此,如果我想要天气,我必须说它就像我编码它,没有变化。我想知道是否有代码可以改变这个?

我希望能够说“明天的天气是什么”,“明天天气如何”或“你能告诉我明天的天气”它告诉我接下来的天气,但我不想要在每个短语中键入代码。我在那里看到了关于e.Result.Alternates的东西,是我需要使用的吗?

2 个答案:

答案 0 :(得分:3)

如果不涉及语言资源,就无法做到这一点。让我解释一下我的意思。

您可能已经注意到,您的C#程序仅识别预先录制的短语,并且只有在您说出完全相同的单词时才会识别。 (作为一个旁边的节点,这本身就是一个很大的成就,因为你几乎不能说一次句子而不改变它。小的变化,例如声音频率或长度,可能与你的同事无关,但是它们对你的程序很重要。)

因此,您需要在程序中加入一种语言资源。换句话说,让它“理解”关于人类语言的事实。以下两个增加复杂性的建议。所有apporaches都假设您的工具能够以合理的方式对音频输入流进行标记,即从中提取单词。

模式匹配

避免对

这样的句子进行硬编码
Tell me about the weather.
What's the weather tomorrow?
Weather report!

您可以改为定义匹配任何句子的模式:

if a sentence contains "weather", then output a weather report

这可以通过多种方式进一步细化,例如:

if a sentence contains "weather" and "tomorrow", output tomorrow's forecast.
if a sentence contains "weather" and "Bristol", output a forecast for Bristol

这种知识必须明确地放入你的程序中,例如以字典或查找表的形式。

衡量相似度

如果你打算花更多的时间在这上面,你可以实现一种方法来找到输入句子之间的相似性。这也有很多种方法,但突出的方法是一袋词,用矢量表示。

在这个模型中,每个句子都表示为一个向量,其中的每个单词都表示为向量的维度。例如,句子“我讨厌青苹果”可以表示为

I = 1
hate = 1
green = 1
apples = 1
red = 0
you = 0

请注意,在此特定句子中未出现的单词,但在程序可能遇到的其他短语中,也表示维度(例如red = 0)。

这种方法的最大优点是可以轻松计算向量的相似性,无论它们是多维的。有几种估计相似性的技术,其中一种是余弦相似度(参见例如http://en.wikipedia.org/wiki/Cosine_similarity)。


更一般地说,当然还有许多其他考虑因素。

例如,某些单词可能与您要传达的信息完全无关,如下面的句子所示:

I want you to output a weather report.

在这里,至少“我”,“你”,“到”和“一个”可以在不损害句子的基本语义的情况下完成。这些词被称为停用词,并且在许多执行语音到文本分析的工具中被提前丢弃。

另请注意,我们假设您的程序可靠地识别声音输入。实际上,没有任何工具能够无误地识别语音。

人类往往会忘记声音确实存在而没有关于单词或句子边界的提示。这使得输入的所谓消歧成为一项容易被低估的庞大任务 - 而且歧义一般是计算语言学中最难的问题之一。

答案 1 :(得分:1)

为此,代码将无法判断!您需要在文本数组中拆分命令!如

  1. 明日

  2. 天气

  3. 什么

  4. 这样,您可以将其与计算机中的文本进行比较!让我们说,使用类型(天气)和时间(明天)的命令(什么)。

    最好阅读并理解每个单词,然后猜测它会像Google一样工作!谷歌使用相同的,他们分解字符串并进行比较。