Можно ли с помощью SAPI ввести пиньинь для китайского произношения?

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

введите здесь описание изображения

Если я сделаю это из С#, он просто прочитает тег:

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

person tofutim    schedule 14.06.2011    source источник
comment
Есть ли внутреннее исключение? Если так, то, что это?   -  person RLH    schedule 22.06.2011


Ответы (3)


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

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

введите здесь описание изображения

И вот код, стоящий за этим; Я получаю фонему из таблицы китайских фонем.

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);

            }
        }
    }
}

Перед тестированием обязательно выберите (Microsoft Simplified Chinese) в поле со списком. Если у вас его нет, вы можете скачать языковой пакет Microsoft Speech (SpeechSDK51LangPack.exe).

Изменить:

в SpeechSynthesizer pron => фонема и 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);
}
person Issam Ali    schedule 22.06.2011
comment
Ага, я использовал System.Speech.Synthesizer. - person tofutim; 22.06.2011
comment
Это выполнимо из System.Speech.Synthesizer? - person tofutim; 22.06.2011
comment
SpeechSynthesizer является своего рода оболочкой для библиотеки SAPI COM, и, похоже, у него есть проблемы с пользовательским произношением. Вам следует попробовать использовать SpeakAsync с параметром PromptBuilder. Создайте новый PromptBuilder и используйте AppendTextWithPronunciation. Я проверил это. Он работает с английской культурой, но не с китайской... извините за задержку, у нас плохой интернет :( - person Issam Ali; 22.06.2011
comment
PS, если SpeechSynthesizer - это просто оболочка, почему бы не использовать оригинальную библиотеку, она работает как шарм;) - person Issam Ali; 22.06.2011
comment
кажется, что в XML, используемом SpeechSynthesizer, есть некоторые изменения синтаксиса. новый код, добавленный в ответ, отлично работает с SpeechSynthesizer. надеюсь, это решит проблему. - person Issam Ali; 22.06.2011
comment
В начале 1 угла слышен плохой лай - интересно, можно ли с этим разобраться - person tofutim; 22.08.2015


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

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);
}
person therealmitchconnors    schedule 22.06.2011