2

无法停止 xamarin 基本文本到语音,以便使用 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:无法开始播放”

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

编辑:

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

4

1 回答 1

0

我无法重现您的问题。

以下代码适用于 iOS 和 Android,使用Xamarin.Essentials v1.3.0Xamarin.Forms v4.2.0.709249

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

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

  • 在 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);
            }
        }
    }
}
于 2019-09-09T01:52:49.800 回答