[英]Control the volume of AVAudioSession.Mode.voicePrompt from within an app
我在項目中使用文本到語音。 從iOS 12開始,Apple推出了AVAudioSession.Mode
名為voicePrompt
的新voicePrompt
。 這個行為與其他所有行為完全不同,因為它有自己的音量滑塊,例如它與Apple Maps應用程序共享。
當用戶按下音量AVAudioSession
按鈕時,它會使用模式voicePrompt
更改系統范圍的音量,而不是AVAudioSession
的voicePrompt
。 如果使用voicePrompt
的應用程序當前播放音頻,則電話音量按鈕現在可以完全獨立於其他全局設置控制此音量集。
與我認為已經存在一段時間的Android不同,在iOS上看起來相當奇怪。 我可能會誤解這個假設,但重點是我希望有一個以應用程序的方式來控制這個卷,因為幾乎所有的應用程序用戶都不理解這種行為。 他們不明白為了改變音量,應用必須主動播放音頻/使用speechSyntheziser才能改變與之相關的音量。
導入MediaPlayer
時,可以通過使用MPVolumeView
在應用內控制全局卷。 有沒有人知道voicePrompt
從應用程序內同時控制voicePrompt
模式的音量?
根據我的經驗,voicePrompt模式與卷視角下的默認模式沒有什么不同。 您可以通過更改媒體卷來更改音量(通過MPVolumeView確實):
默認情況下,如果沒有播放媒體,硬件音量按鈕始終控制系統音量(鈴聲和警報聲音)。 如果正在播放媒體,則他們會控制“媒體”音量。 (我同意這對用戶來說確實令人困惑)但這是標准行為,不能在代碼中更改。 用戶可以在iOS設置應用>聲音和觸覺>使用按鈕更改中更改此設置。
不確定它會對您有所幫助,但我寫了這個擴展來更改您應用中的媒體音量:
extension MPVolumeView {
static func setVolume(_ volume: Float) {
let volumeView = MPVolumeView(frame: .zero)
if let slider = volumeView.subviews.first(where: { $0 is UISlider }) as? UISlider {
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.02) {
slider.value = volume
}
// Optional - Remove the HUD
// if let app = UIApplication.shared.delegate as? AppDelegate, let window = app.window {
// volumeView.alpha = 0.000001
// window.addSubview(volumeView)
// }
}
}
static func changeVolume(change: Float) {
let volumeView = MPVolumeView(frame: .zero)
if let slider = volumeView.subviews.first(where: { $0 is UISlider }) as? UISlider {
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.02) {
let currentVolume = round(slider.value * 16)/16
slider.value = currentVolume + change
}
// Optional - Remove the HUD
// if let app = UIApplication.shared.delegate as? AppDelegate, let window = app.window {
// volumeView.alpha = 0.000001
// window.addSubview(volumeView)
// }
}
}
static func increaseVolume() {
MPVolumeView.changeVolume(change: 1/16)
}
static func decreaseVolume() {
MPVolumeView.changeVolume(change: -1/16)
}
}
現在,這會改變媒體量。 您可以為文本到語音或在應用中播放的聲音文件設置不同的音量。
要更改聲音文件的音量,請使用
AVPlayerInstance.volume = 0.5
為了改變文本的語音量,我們
AVSpeechUtteranceInstance.volume = 0.5
但是:您在此處設置的音量值與媒體音量相對。 所以,最多,你的聲音可以像媒體播放一樣響亮,從不大聲! (如果有辦法這樣做請告訴我,因為我認為即使在使用藍牙耳機或車載音樂時,我的文字到語音提示也應該更響亮。
到目前為止,我沒有發現默認模式和voicePrompt模式之間的任何差異(我希望它可能會增加文本到語音的音量,但它沒有)。 關於它的文檔目前沒有說任何有用的東西,所以現在,我遠離.voicePrompt模式。 至少在有關其特定目的和差異的更多文檔可用之前。 (如果您知道任何差異,請告訴我,非常好奇)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.