【问题标题】:Xamarin Forms Text To Speech Wont Play On Device Without HeadphonesXamarin Forms Text To Speech 无法在没有耳机的设备上播放
【发布时间】:2021-04-30 08:42:59
【问题描述】:

我有一个使用文本转语音的 Xamarin Forms 应用程序。 iOS 项目中的代码与官方 Xamarin 实现文本到语音指南中的代码完全相同

    var speechSynthesizer = new AVSpeechSynthesizer ();
    var speechUtterance = new AVSpeechUtterance (text) {
        Rate = AVSpeechUtterance.MaximumSpeechRate/4,
        Voice = AVSpeechSynthesisVoice.FromLanguage ("en-US"),
        Volume = 0.5f,
        PitchMultiplier = 1.0f
    };

    speechSynthesizer.SpeakUtterance (speechUtterance);

这在 iOS 模拟器中效果很好,但是当我部署到运行 iOS 10.2.1 的 iPad 时,只有戴上耳机才能听到任何声音。我已经把音量调高了,没有耳机还是什么都没有,如果我确实使用耳机,虽然它非常响亮,所以这意味着它不仅仅是太安静。其他应用程序可以通过我的 iPad 扬声器播放音频,所以我认为这不是硬件问题。

我也尝试使用此插件 (https://github.com/jamesmontemagno/TextToSpeechPlugin) 进行文本到语音转换,但在我部署到设备时出现完全相同的问题。

是否有任何理由可以使用耳机,但在没有插入耳机时会失败?

【问题讨论】:

  • 您是否拨动了 iOS 设备侧面的开关以使其关闭静音模式?
  • 这是air 2所以没有开关。其他应用程序会播放音频,所以我假设它不会是静音模式问题
  • 哦,没错!向上滑动时在面板中怎么样?钟形标志?这就是您打开和关闭静音模式的方式。作为开发人员,您可以选择忽略静音模式开关,但默认情况下它将遵循该设置。所以这可能是问题所在,而其他应用程序播放声音。
  • 我不知道其他应用程序可以忽略静音模式,而耳机也会忽略它。这正是问题所在。如果您想发布答案,我会接受。
  • 至少你学到了一两件事 ;) 将其作为答案发布,谢谢!

标签: xamarin.ios xamarin.forms text-to-speech


【解决方案1】:

我看不出您的代码不能正常工作的明显原因。我唯一的解释是在您的 iDevice 上激活了“静音模式”。要关闭此功能,请使用左侧的开关,或者对于较新的设备,通过从屏幕底部向上滑动并按下铃铛图标进入 control center

您还注意到其他应用确实会发出声音。作为开发人员,您可以选择忽略静音模式并播放声音,虽然这应该被认为是不好的做法,但 Apple 允许这样做。但是,默认情况下它是不启用的,所以你有声音的代码会被静音模式静音。

【讨论】:

    【解决方案2】:

    似乎无法绕过静音模式,但您可以检测到它,并在静音开关打开时通知用户文本转语音不起作用。

    这是一个受SoundSwitch 库启发的解决方案。在 iPhone 8 上,await 50 毫秒长的 mute.caf 需要 160-250 毫秒,但静音开关打开时只需 3-8 毫秒。你可以从this Gist下载50ms的mute.caf

    using System;
    using Foundation;
    using AudioToolbox;
    using System.Threading.Tasks;
    
    public class SilentSwitch
    {
        readonly SystemSound _sound;
    
        public SilentSwitch()
        {
            var url = NSBundle.MainBundle.GetUrlForResource("mute", "caf");
            _sound = new SystemSound(url);
            _sound.IsUISound = true;
        }
    
        public async Task<bool> IsEnabled()
        {
            var startTime = DateTime.Now;
    
            await _sound.PlaySystemSoundAsync();
    
            var elapsedTime = DateTime.Now - startTime;
            return elapsedTime.TotalMilliseconds < 50;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-10-26
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-04
      • 1970-01-01
      • 2017-06-11
      相关资源
      最近更新 更多