簡體   English   中英

從應用程序中控制AVAudioSession.Mode.voicePrompt的音量

[英]Control the volume of AVAudioSession.Mode.voicePrompt from within an app

我在項目中使用文本到語音。 從iOS 12開始,Apple推出了AVAudioSession.Mode名為voicePrompt的新voicePrompt 這個行為與其他所有行為完全不同,因為它有自己的音量滑塊,例如它與Apple Maps應用程序共享。

當用戶按下音量AVAudioSession按鈕時,它會使用模式voicePrompt更改系統范圍的音量,而不是AVAudioSessionvoicePrompt 如果使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM