Xamarin表示文本语音不会在没有耳机的设备上播放

时间:2017-02-22 08:58:22

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

我有一个使用文字转语音的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)进行文字转语音,但在部署到设备时却遇到完全相同的问题。

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

2 个答案:

答案 0 :(得分:3)

我认为没有明显的理由说明您的代码不起作用。我唯一的解释是你的iDevice上激活了“静音模式”。要关闭此功能,请使用左侧的开关,或者使用较新的设备进入control center,方法是从屏幕底部向上滑动并按下铃铛图标。

iOS control center

您还注意到其他应用会产生声音。作为开发人员,您可以选择忽略静音模式并播放声音,而这应该被认为是不好的做法,Apple允许这样做。但是,默认情况下不启用它,因此使用静音模式可以使声音静音。

答案 1 :(得分:0)

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

这是一个受 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;
    }
}