UWP的SpeakProgress事件处理程序是什么?

3
我该如何在使用SpeechSynthesis类的UWP中实现类似于SpeakProgressEvent的功能呢?WPF/.NET中有这个事件可以挂钩,然而,在UWP框架中他们在哪里隐藏了这个特性我非常困惑。是否.NET SpeakProgressEvent有办法映射到UWP的MediaElement事件上呢?
// NOTE: This is a windows 10 UWP Application (Not WPF/.NET)
using Windows.Media.SpeechSynthesis;
using System.Threading.Tasks;

//XAML: <MediaElement Name="mediaElement"/>

namespace App1
{
    public sealed partial class MainPage : Page
    {
        SpeechSynthesizer            synth;

        public MainPage()
        {
            this.InitializeComponent();
            synth = new SpeechSynthesizer();

           // Doesn't Exist for UWP
            synth.SpeakProgress 
                 += new EventHandler<SpeakProgressEventArgs>
                    (synthesizer_SpeakProgress);

           // Doesn't Exist for UWP
            synth.SpeakStarted 
                 += new EventHandler<SpeakStartedEventArgs>
                    (synthesizer_SpeakStarted);

           // Doesn't Exist for UWP
            synth.SpeakCompleted 
                 += new EventHandler<SpeakCompletedEventArgs>
                    (synthesizer_SpeakCompleted);
        } //MainPage

        async Task Speak(string text)
        {
             SpeechSynthesisStream speech;
             speech = await synth.SynthesizeTextToStreamAsync(text);
             mediaElement.SetSource(speech, speech.ContentType);
        }

        void synthesizer_SpeakProgress(
               object sender, SpeakProgressEventArgs e)
        {
            //show the synthesizer's current progress 
            //labelProgress.Content = e.Text;
            //SolidColorBrush highlightColor 
            //   = new SolidColorBrush(Colors.Yellow);
            //HighlightWordInRichTextBox(
            //    richTextBox1, e.Text, highlightColor);
        }


    } //class
} //namespace
3个回答

3
这里的难点在于,虽然 WPF 的 System.Speech.Synthesis.SpeechSynthesizer 自己处理音频输出,但 UWP 的 Windows.Media.SpeechSynthesis.SpeechSynthesizer 是将结果渲染到流中,然后可由 MediaElement 播放。由此,大部分的元数据丢失了,MediaElement 不知道当前正在朗读哪个单词,因此无法提供类似于 SpeakProgress 的事件。
你可以采取以下措施:
首先,请设置以下 SpeechSynthesizer 选项,以确保在流合成过程中维护所有元数据:
synth = new SpeechSynthesizer
{
    Options = { IncludeWordBoundaryMetadata = true, IncludeSentenceBoundaryMetadata = true }
};

请注意,由synth.SynthesizeTextToStreamAsync(...)创建的流不是常规的IRandomAccessStream,而是SpeechSynthesisStream,它提供了一些附加属性。例如,分析流的TimedMetadataTracks:通常,这将包含两个项目,一个包含单词边界元数据的轨道和一个包含句子边界元数据的轨道。
这些TimedMetadataTrack对象中最有趣的属性可能是Cues:这是一个集合,其中包含类型为Windows.Media.Core.SpeechCue的元素,每个元素对应于原始文本中的一个句子/单词。每个项目都包括以下信息:
  1. 字符位置(请检查提示的StartPositionInInputEndPositionInInput属性)
  2. 音频位置(请参阅StartTime属性)
这意味着: 不幸的是,如前所述,没有方便的事件通知您进度,但是您应该能够通过这些元数据属性检索有关当前状态/位置的必要信息。

1
我假设您正在尝试从数据流中获取嘴部动画所需的发音信息。
一种可能的方法是使用语音合成流提示来创建媒体标记。然后连接到媒体播放器的标记达到事件。
使用CMU字典获取音素信息,然后查找与音素相关联的发音。
播放媒体流时,将达到标记,然后可以更改字符的口形。


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