【问题标题】:How to stop/cut-off xamarin essentials text-to-speech on iOS to start new speech如何在 iOS 上停止/切断 xamarin Essentials 文本转语音以开始新语音
【发布时间】:2019-08-27 15:12:40
【问题描述】:

无法停止 xamarin essentials 文本转语音以便使用 Xamarin.Forms 启动新的文本转语音“SpeakAsync”调用。

将此应用程序用作“练习电话”的模拟接线员,我想在用户挂断电话时切断接线员说“你好,这是....”,并使用 speak async 开始在将之前的文本转为语音后立即说“此通话已结束”

await TextToSpeech.SpeakAsync("Hello this is the operator, thank you for calling, how can I help you?"
    , SpeechTokenSource.Token);

这目前在 android 上按预期工作

public void CancelSpeech()
{
    if (SpeechTokenSource?.IsCancellationRequested ?? true)
    return;

    SpeechTokenSource.Cancel();
}

尝试使用文档中列出的取消令牌 (https://docs.microsoft.com/en-us/xamarin/essentials/text-to-speech) 但是,我无法让当前的“SpeakAsync”语音立即停止在 iOS 上播放,或者在取消初始文本转语音后,下一个 speakasync 命令开始在 iOS 上朗读文本。

   CancelSpeech();

   IsCallActive = false;
   DialedText = null;

   //Reset speech cancellation token
   SpeechTokenSource = new CancellationTokenSource();

   await TextToSpeech.SpeakAsync("This call has ended. Goodbye."
   , SpeechTokenSource.Token);

iOS 输出中记录的错误: "[AXTTSCommon] _BeginSpeaking: 无法开始播放"

我有什么遗漏吗?如何取消当前正在播放的文本转语音并立即开始下一个语音?

编辑:

这需要通过单击一个按钮来完成(取消当前语音并开始“此通话已结束”语音)

【问题讨论】:

  • 我测试了一下,遇到了同样的问题。我可以给你一个解决方法是你可以在CancelSpeech(); 之后放置一个await Task.Delay(2000);,然后它会按你的预期工作。尝试第二次演讲时,我收到一个名为 BeginSpeaking: couldn't begin playback 的错误。您可以创建问题here 以获得更多帮助,如果我发现任何问题,我会及时通知您。
  • @JackHua-MSFT 您链接到了错误的 GitHub 存储库。他正在使用 Xamarin.Essentials,需要在 Xamarin.Essentials GitHub 存储库中打开问题:github.com/xamarin/Essentials
  • @JackHua-MSFT,2 秒的任务延迟确实允许它按预期运行,但是,它不能作为最终解决方案,因为我们不能让应用程序暂停 2在生产中的每个文本到语音呼叫之前的秒数

标签: c# xamarin.forms xamarin.ios text-to-speech xamarin.essentials


【解决方案1】:

我无法重现您的问题。

下面的代码可以在 iOS 和 Android 上使用 Xamarin.Essentials v1.3.0 和 Xamarin.Forms v4.2.0.709249。

点击speakButton 时,朗读文本,朗读文本时点击cancelButton 时,停止朗读。

在 iOS 和 Android 上取消 SpeakAsync 时有一个区别:

  • 在 iOS 上,当前正在说出的单词已经说完,然后停止说话
  • 在 Android 上,当前正在说的单词被切断并且说话停止

示例代码

完整的示例应用可以在这里找到:https://github.com/brminnick/CancelTextToSpeechSample/tree/master

using System;
using System.Threading;
using Xamarin.Forms;

namespace CancelTextToSpeechSample
{
    public class App : Application
    {
        public App()
        {
            MainPage = new CancelSpeakPage();
        }

        class CancelSpeakPage : ContentPage
        {
            const string _spokenText = "Oh, supercalifragilisticexpialidocious! Even though the sound of it, Is something quite atrocious, If you say it loud enough, You'll always sound precocious, Supercalifragilisticexpialidocious!";

            CancellationTokenSource _speakButtonCancellationTokenSource;

            public CancelSpeakPage()
            {
                var speakButton = new Button { Text = "Sing" };
                speakButton.Clicked += HandleSpeakButtonClicked;

                var cancelButton = new Button { Text = "Cancel Song" };
                cancelButton.Clicked += HandleCancelButtonClicked;

                Content = new StackLayout
                {
                    VerticalOptions = LayoutOptions.Center,
                    HorizontalOptions = LayoutOptions.Center,

                    Children =
                    {
                        speakButton,
                        cancelButton
                    }
                };
            }

            void HandleCancelButtonClicked(object sender, EventArgs e)
            {
                _speakButtonCancellationTokenSource?.Cancel();
            }

            async void HandleSpeakButtonClicked(object sender, EventArgs e)
            {
                if (_speakButtonCancellationTokenSource?.IsCancellationRequested is false)
                    _speakButtonCancellationTokenSource.Cancel();

                _speakButtonCancellationTokenSource = new CancellationTokenSource();
                await Xamarin.Essentials.TextToSpeech.SpeakAsync(_spokenText, _speakButtonCancellationTokenSource.Token);
            }
        }
    }
}

【讨论】:

  • 在 iOS 上仍然收到错误:“[AXTTSCommon] _BeginSpeaking: 无法开始播放”,点击按钮几秒钟后第一个语音被切断,第二个语音不播放,我我正在使用 MVVM 模式,而不是代码隐藏。
  • 您是否在使用我创建的示例时遇到了该错误?该示例适用于我的 iOS 模拟器和我的 iPhone。
  • 在我运行 iOS 12.4.1 的 iPhone X 上,您的示例项目不会取消文本转语音,也不会播放第二个文本转语音请求。在我的情况下,主要问题是在取消第一个请求后,第二个语音在请求时没有播放。
  • @SchwartzBrian 我不确定您遇到的问题,因为该示例确实取消了文本转语音,并且确实播放了第二个文本转语音。我已将一段视频上传到 repo,显示示例说话、取消然后再次说话:github.com/brminnick/CancelTextToSpeechSample/blob/master/…
  • 我遇到了最初帖子中描述的问题。当我“取消”当前正在朗读的语音时,第二个文本转语音不会启动,并且我收到 iOS 上列出的错误。您的示例有一个“唱歌”按钮和一个“取消”按钮(您的取消按钮仅取消当前语音,不会以相同的方法启动另一个文本到语音
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多