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

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

在此处输入图像描述

如果我从 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\"/>");
        }
4

3 回答 3

5

我做了这个例子,它工作得很好,我不会说中文,所以,我使用自动翻译器来获取示例词。

这是表单的设计:

在此处输入图像描述

这是它背后的代码;我从中文音素表中得到音素。

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)。如果没有,可以下载微软语音的语言包(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\">变&lt;/phoneme></speak>";
    sp.SpeakSsml(s);
}
于 2011-06-22T17:06:34.413 回答
0

您是否尝试过:

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

?

您也可能想在这里查看

于 2011-06-21T18:09:09.763 回答
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);
}
于 2011-06-22T18:03:58.627 回答