使用SAPI,是否有一种输入拼音以进行中文发音的方法?

13

目标是能够发音像"wo3"这样的拼音。System.Speech可以处理中文字符,但是否有一种直接输入拼音的方法?从http://msdn.microsoft.com/en-us/library/ms720566(v=vs.85).aspx看来,我应该能够这样写出拼音。

<PRON SYM="ni 3"/>

我该如何使用PRON SYM?

更新: 以下是一些讨论此问题但未提供解决方案的网页: - http://www.ms-news.net/f3012/problem-with-phonemes-and-chinese-tts-3031240.html

更新2: 我正在使用.NET中的System.Speech.Synthesizer。也许这就是问题所在。我可以看到将其输入到语音属性中可以正常工作:

enter image description here

如果我从C#中这样做,它只会读取标签:

        var culture = CultureInfo.GetCultureInfo("zh-CN");
        var synth = new SpeechSynthesizer();
        var voices = synth.GetInstalledVoices(culture);

        if (voices.Count > 0)
        {
            synth.SelectVoice(voices[0].VoiceInfo.Name);
            synth.Speak("<pron sym=\"ni 3 hao 3 xiao 1\"/>");
        }

有内部异常吗?如果有,它是什么? - RLH
3个回答

5
我已经制作了这个示例并且它运行正常,由于我不会说中文,所以我使用自动翻译来获取样本单词。
下面是表单的设计: enter image description here 这里是代码背后的逻辑:我从中文音素表中获取音素。
using System;
using System.Windows.Forms;
using SpeechLib;

namespace SpeechDemo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        private void Form1_Load(object sender, EventArgs e)
        {
            //get installed voices
            SpVoice voice = new SpVoice();
            foreach (var item in voice.GetVoices())
            {
                comboBox1.Items.Add(((ISpeechObjectToken)item).GetDescription());
            }
        }

        private void btnSpeakPhonems_Click(object sender, EventArgs e)
        {
            if (comboBox1.SelectedIndex > 0)
            {
                SpVoice voice = new SpVoice();
                voice.Voice = voice.GetVoices().Item(comboBox1.SelectedIndex);
                voice.Speak("<pron sym=\"ang 1 zang 1\">变脏</pron>", SpeechVoiceSpeakFlags.SVSFlagsAsync);

            }
        }
    }
}

请确保在测试之前从ComboBox中选择(Microsoft Simplified Chinese)选项。如果没有,您可以下载Microsoft Speech的语言包(SpeechSDK51LangPack.exe)。
编辑:
在SpeechSynthesizer中,pron => phoneme和sym => ph。以下是适用于SpeechSynthesizer的代码:
private void button1_Click(object sender, EventArgs e)
{
    var cu = CultureInfo.GetCultureInfo("zh-CN");
    SpeechSynthesizer sp = new SpeechSynthesizer();
    var voices = sp.GetInstalledVoices(cu);
    sp.SelectVoice(voices[0].VoiceInfo.Name);
    string s = "<?xml version=\"1.0\"?> <speak version=\"1.0\" xml:lang=\"zh-CN\"><phoneme ph=\"ang 1 zang 1\">变</phoneme></speak>";
    sp.SpeakSsml(s);
}

啊哈,我正在使用 System.Speech.Synthesizer。 - tofutim
这可以通过System.Speech.Synthesizer实现吗? - tofutim
SpeechSynthesizer是一种对SAPI COM库的包装器,似乎它在自定义发音方面存在问题。您应该尝试使用带有PromptBuilder参数的SpeakAsync。创建新的PromptBuilder并使用AppendTextWithPronunciation。我已经测试过了。它适用于英语文化,但不适用于中文...很抱歉我们这里的网络很差:( - Issam Ali
PS,如果SpeechSynthesizer只是一个包装器,为什么不使用原始库,它的效果非常好呢 ;) - Issam Ali
似乎 SpeechSynthesizer 使用的 XML 语法有一些更改。答案中添加的新代码与 SpeechSynthesizer 配合良好。希望这能解决问题。 - Issam Ali
第1个角色开始时有一个刺耳的咆哮声 - 不知道能否解决。 - tofutim

0

你尝试过这个吗:

<PRON SYM="ni 3"> sometext</PRON>

?

另外,您可能想要在这里检查一下。


是的,我遇到了TargetInvocationException异常。如果您有一个可用的使用示例,那就太好了!我从来没有能够从文档中理解它。 - tofutim

0

我认为你的例子只需要稍作修改...

if (voices.Count > 0)        
{
     synth.SelectVoice(voices[0].VoiceInfo.Name);
     PromptBuilder pb = new PromptBuilder();
     pb.AppendSsml("<pron sym=\"ni 3 hao 3 xiao 1\"/>");
     synth.Speak(pb);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接