Windows Phone 8语音合成器暂停

本文关键字:合成器 暂停 语音合成 语音 Phone Windows | 更新日期: 2023-09-27 18:06:03

我正在开发一个应用程序,我想在语音合成器之间暂停。SpeakTextAsync正在运行,并从那里恢复。

await synthesizer.SpeakTextAsync(text);
var stop = true;

Windows Phone 8语音合成器暂停

停止读取

前段时间有人在这里发帖,同时我刷新了页面,读了他的回答,看到了一个通知& &;再次刷新页面&答案不见了。但不管是谁发帖,他都是救命恩人。它在我脑海里挥之不去,我最终创造了这个。

    String text;  // your text to read out loud
    String[] parts = text.Split(' ');
    int max = parts.Length;
    int count = 0;
    private String makeSSML() {
        if (count == max) { 
            count= 0;
        }
        String s = "<speak version='"1.0'" ";
        s += "xmlns='"http://www.w3.org/2001/10/synthesis'" xml:lang='"en-US'">";
        for (int i = count; i < max; i++)
        {
            s += parts[i];
            s += "<mark name='"anything'"/>";
        }
        s += "<mark name='"END'"/>";
        s += "</speak>";
        return s;
    }
    private void playIT(){
        synth = new SpeechSynthesizer();
        synth.BookmarkReached += synth_BookmarkReached;
        synth.SpeakSsmlAsync(makeSSML());
    }
    private void synth_BookmarkReached(object sender, SpeechBookmarkReachedEventArgs e)
    {
        count++;
        if (e.Bookmark == "END") {
            synth.Dispose();
        }
    }
    private void Pause_Click(object sender, RoutedEventArgs e)
    {
        synth.Dispose();
    }

谢谢你,你的回答给了我灵感。

嗯,根据文档,当您调用CancellAll时,您正在取消异步执行的任务。根据约定,这将导致抛出OperationCancelledException。这意味着无论你在哪里调用SpeakTextAsync, SpeakSsmlAsync或SpeakSsmlFromUriAsync,你必须用try/catch语句包围这些调用,以防止此异常未被捕获。

例子:

private static SpeechSynthesizer synth;
public async static Task<SpeechSynthesizer> SpeechSynth(string dataToSpeak)
        {
            synth = new SpeechSynthesizer();
            IEnumerable<VoiceInformation> englishVoices = from voice in InstalledVoices.All
                                                          where voice.Language == "en-US"
                                                          && voice.Gender.Equals(VoiceGender.Female)
                                                          select voice;
            if (englishVoices.Count() > 0)
            {
                synth.SetVoice(englishVoices.ElementAt(0));
            }
            await synth.SpeakTextAsync(dataToSpeak); 
            return synth;
        }  

public static void CancelSpeech()
        {
            synth.CancelAll();
        }

现在在您想要的地方调用SpeechSynth("Some Data to Speak"),并且每当您想要取消它时,只需调用CancelSpeech()

完成!享受……!