寻找发音的正确性

2024-05-01

我需要借助 Microsoft 语音 SDK 来识别用户发音的“质量”(System.Speech.Recognition)。我使用的是 MS Speech Engine - US,所以我实际需要的是找出说话者的声音与“北美”口音的接近程度。

实现此目的的一种方法是检查用户的语音与美国英语语音发音的接近程度。正如MSDN中提到的,这个过程似乎是在语音SDK内部完成的,所以我需要把它弄出来。由于我们也可以自己将拼音设置为引擎,所以我确信这是可能的。

但是,我不清楚我必须做什么。那么,如何才能了解用户的发音质量/与美国北美英语音标发音的接近程度呢?用户只需说出预定义的句子,例如“Hello World。我在这里”。

Update

我通过使用以下代码获得了某种“音素”(如 MSDN 中所述)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Speech.Recognition;
using System.Speech.Synthesis;
using System.Windows.Forms;
using System.IO;

namespace US_Speech_Recognizer
{
    public class RecognizeSpeech
    {
        private SpeechRecognitionEngine sEngine; //Speech recognition engine
        private SpeechSynthesizer sSpeak; //Speech synthesizer
        string text3 = "";

        public RecognizeSpeech()
        {
            //Make the recognizer ready
            sEngine = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("en-US"));


            //Load grammar
            Choices sentences = new Choices();
            sentences.Add(new string[] { "I am hungry" });

            GrammarBuilder gBuilder = new GrammarBuilder(sentences);

            Grammar g = new Grammar(gBuilder);

            sEngine.LoadGrammar(g);

            //Add a handler
            sEngine.SpeechRecognized +=new EventHandler<SpeechRecognizedEventArgs>(sEngine_SpeechRecognized);


            sSpeak = new SpeechSynthesizer();
            sSpeak.Rate = -2;



            //Computer speaks the words to get the phones
            Stream stream = new MemoryStream();
            sSpeak.SetOutputToWaveStream(stream);


            sSpeak.Speak("I was hungry");
            stream.Position = 0;
            sSpeak.SetOutputToNull();


            //Configure the recognizer to stream
            sEngine.SetInputToWaveStream(stream);

            sEngine.RecognizeAsync(RecognizeMode.Single);


        }


        //Start the speech recognition task
        private void sEngine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            string text = "";

            if (e.Result.Text == "I am hungry")
            {
                foreach (RecognizedWordUnit wordUnit in e.Result.Words)
                {
                    text = text + wordUnit.Pronunciation + "\n";
                }

                MessageBox.Show(e.Result.Text + "\n" + text);
            }


        }
    }
}

这是与音素相关的直接代码片段(摘自上面的代码)

   //Start the speech recognition task
    private void sEngine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
    {
        string text = "";

        if (e.Result.Text == "I am hungry")
        {
            foreach (RecognizedWordUnit wordUnit in e.Result.Words)
            {
                text = text + wordUnit.Pronunciation + "\n";
            }

            MessageBox.Show(e.Result.Text + "\n" + text);
        }


    }

以下是我的输出。我得到的音素从第二行开始显示。第一行仅显示识别的句子

所以,请告诉我,根据 MSDN,这是“音素”。那么,这实际上是“音素”吗?我从来没有见过这些,这就是原因。

上面的代码是根据这个链接完成的http://msdn.microsoft.com/en-us/library/microsoft.speech.recognition.srgsgrammar.srgstoken.pronunciation(v=office.14).aspx http://msdn.microsoft.com/en-us/library/microsoft.speech.recognition.srgsgrammar.srgstoken.pronunciation(v=office.14).aspx


好的,这就是我解决这个问题的方法。

首先,使用发音主题加载听写引擎,该主题将返回用户所说的音素(在识别事件中)。

其次,使用以下命令获取该单词的参考音素ISpEnginePronunciation::GetPronunciations http://msdn.microsoft.com/en-us/library/ms717841%28v=VS.85%29.aspx方法(正如我概述的here https://stackoverflow.com/a/2909005/175201).

一旦获得两组音素,您就可以比较它们。本质上,音素由空格分隔,每个音素由一个短标签表示(在美式英语音素表示 http://msdn.microsoft.com/en-us/library/ee431828%28v=vs.85%29.aspx规格)。

鉴于此,您应该能够通过任意数量的近似字符串匹配方案(例如,编辑距离 http://en.wikipedia.org/wiki/Levenshtein_distance).

通过比较电话 ID 而不是字符串,您可能会发现问题更简单;ISpPhoneConverter::PhoneToId http://msdn.microsoft.com/en-us/library/ms718373(v=vs.85).aspx可以将音素字符串转换为一组phoneID,每个音素一个ID。这将为您提供一对以空结尾的整数数组,也许更适合您的比较算法。

您可以使用引擎置信度来惩罚匹配,因为低引擎置信度表明传入的音频与引擎的音素概念不紧密匹配。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

寻找发音的正确性 的相关文章

随机推荐

  • Bootstrap 与 Haml 和 Rails 一起崩溃

    我对 Rails 编程等很陌生 所以如果这是非常基本的 我很抱歉 我正在尝试让 twitter bootstrap crash js 在我的网络应用程序上工作 我试图遵循这里的结构http getbootstrap com javascri
  • 如何在 Tensorflow 中计算 R^2

    我正在尝试在 Tensorflow 中进行回归 我不确定我计算 R 2 是否正确 因为 Tensorflow 给出的答案与sklearn metrics r2 score有人可以看看我下面的代码 让我知道我是否正确地实现了图中的方程 谢谢
  • 如何调试没有错误消息的错误?

    如何调试没有错误消息的错误 当加载 PHP 页面时 我在 Firefox 中收到此错误 The connection to the server was reset while the page was loading 除了看起来是 Apa
  • 如何在编译时检查该类是否是抽象的?

    我所说的抽象类是指至少具有一个纯虚方法的类 如果检查显示该类是 我希望编译失败not抽象的 有可能吗 Use std is abstract http en cppreference com w cpp types is abstract
  • 请求/响应的 MQTT 主题名称

    我正在设计一个包含许多设备的系统 使用 MQTT 连接到中央代理 有些主设备可以向某些从设备发送请求 来自一台主机的请求通常会发送给一台从机 请求的主题可以是 mysystem slaveId req 因此从站可以订阅该主题 并且主站可以发
  • 使用包名称获取所有活动

    我想通过使用 PackageInfo 将应用程序中存在的所有活动作为列表获取 请告诉我有什么办法可以做到这一点 提前致谢 我的问题得到的答复如下 public static ArrayList
  • 如何在类的 Dispose 方法中取消订阅匿名函数?

    我有一个 A 类 在它的构造函数中 我正在为 Object B 的 eventHandler 分配一个匿名函数 如何从 A 类的 Dispose 方法中删除 取消订阅 它 任何帮助 将不胜感激 谢谢 Public Class A publi
  • 检查 UIImage 是否有 alpha(透明)颜色时出现问题

    我正在检查图像是否有透明区域 alpha 受到打击 我必须改变颜色UIImage 我已经实现了以下方法来检查图像是否有alpha or not BOOL checkAlpha UIImage image for int x 0 x lt i
  • 空或不需要的结构字段

    我有两个结构体 代表将插入到 mongodb 数据库中的模型 一个结构 投资 将另一个结构 集团 作为其字段之一 type Group struct Base Name string json name bson name type Inv
  • 在 Checkbox.Checked 或 Unchecked 上执行命令

    我的窗口上有一个复选框控件 我想执行一个命令来调用关联视图模型中的方法 我还需要复选框的值 我似乎找不到将命令与复选框关联起来的方法 有人这样做过吗
  • 在鼻子测试中打印不同的长描述以及测试名称 python

    我正在使用命令 nosetests test py 运行时仅打印描述的第一行 我想要完整的描述以及测试名称 我怎么做 测试 py 文件 import unittests class TestClass unittest TestCase d
  • pdo如何检查它是否是从数据库检索的第一条记录?

    sql3 SELECT member FROM levels where upline AND level 1 q3 conn gt prepare sql3 q3 gt execute array level2downlines whil
  • 无法分配“导入类”,因为它是导入 - Javascript

    我一直在初始化一些常量类 export class A foo string b B export class B bar number 然后将它们导入另一个类并在另一个文件中初始化它们 但是 如果我想初始化 A 类时使用 B 类时遇到问题
  • 开发 Google Assistant 应用程序的成本?

    开发和 或发布 Google Assistant 应用程序涉及哪些成本 例如 您可以使用 DialogFlow 和后端 例如 Firebase 开发应用程序 而无需在学习时付费吗 首先 你不need使用 Dialogflow 或 Fireb
  • 在 C++ 中将惰性生成器实现为forward_iterator

    MyGenerator 表示 可能 有限的整数序列 计算成本很高 所以我不想预先生成它们并将它们放入容器中 struct MyGenerator bool HasNext int Next 要打印全部 MyGenerator generat
  • 使用 cut 为时间变量创建 24 个类别

    在这里 我导入数据 对其进行一些操作 这可能不是问题 修复所在 前两行设置了我的剪切参数 lab var num lt 0 24 times var lt c 0 100 200 300 400 500 600 700 800 900 10
  • 如何使用 toLocaleTimeString 12 小时时间而不使用 AM/PM 缩写?

    我想以 12 小时格式显示时间而不使用AM and PM 例如3 45仅且不3 45 PM or 3 45 AM 我该如何修改toLocaleTimeString 不显示PM AM但12位数字格式 var minsToAdd 45 var
  • Cassandra 集群 - 特定节点 - 特定表高丢弃突变

    我在生产中的压缩策略是 LZ4 压缩 但我将其修改为 Deflate 对于压缩更改 我们必须使用 nodetool Upgradesstables 强制升级所有 sstable 上的压缩策略 但是 一旦在集群中的所有 5 个节点上完成了 U
  • 如何使用语法突出显示 zsh 函数的自动建议

    我使用 zsh 并编写了一个函数来替换 cd 功能 在一些帮助下 我让它按照我想要的方式工作 大部分 这是后续我的另一个问题之一 https stackoverflow com questions 64463599 cant use in
  • 寻找发音的正确性

    我需要借助 Microsoft 语音 SDK 来识别用户发音的 质量 System Speech Recognition 我使用的是 MS Speech Engine US 所以我实际需要的是找出说话者的声音与 北美 口音的接近程度 实现此