С помощью SAPI есть способ ввести пиньинь для китайского произношения? - PullRequest
13 голосов
/ 14 июня 2011

Цель - произнести что-то вроде 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 Я использую System.Speech.Synthesizer в .NET.Возможно, это проблема.Я вижу, что ввод его в свойства речи работает нормально:

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\"/>");
        }

Ответы [ 3 ]

5 голосов
/ 22 июня 2011

Я сделал этот пример, и он отлично работает, я не говорю по-китайски, поэтому я использую автоматический переводчик, чтобы получить образец слова.

Вот дизайн формы:

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 Speech (SpeechSDK51LangPack.exe).

Редактировать:

в SpeechSynthesizer pron => phoneme иsym => тел.Вот код, хорошо работает с 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);
}
0 голосов
/ 22 июня 2011

Я думаю, что ваш пример просто нуждается в небольшой модификации ....

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);
}
0 голосов
/ 21 июня 2011

Вы пробовали с:

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

?

Также вы можете проверить здесь .

...