我有一个使用文字转语音的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)进行文字转语音,但在部署到设备时却遇到完全相同的问题。
是否有任何理由可以使用耳机,但在没有插入耳机时会失败?
答案 0 :(得分:3)
我认为没有明显的理由说明您的代码不起作用。我唯一的解释是你的iDevice上激活了“静音模式”。要关闭此功能,请使用左侧的开关,或者使用较新的设备进入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;
}
}