👌

WWDC23セッション要約会 - What_s_new_in_voice_processing他What_s_new_in_Audioを解説

2023/07/03に公開

この記事は?

先日開催された Swift愛好会スピンオフ WWDC23セッション要約会 で登壇したWhat_s_new_in_voice_processing他What_s_new_in_Audioの解説記事です。

Swift愛好会スピンオフ WWDC23セッション要約会の詳細はこちらの記事に書かれています
https://note.com/hcrane/n/nb4e0bbe18ea3

記事の概要

What’s new in voice processing

What’s new in voice processingでは音声処理のアップデートについて話されていました。

  • 他の音声の調整
  • 話し手のミュート機能の追加
    これは主にVoIPapps、いわゆる電話アプリなどで活用されることを想定されているようです

Learn how to use the Apple voice processing APIs to achieve the best possible audio experience in your VoIP apps. We'll show you how to detect when someone is talking while muted, adjust ducking behavior of other audio, and more.

コードを読むと、AVAudioEngineを利用することが基本のようです。
AVAudioVoiceProcessingOtherAudioDuckingConfiguration によってduckingLevelを調整しています。

        let audioEngine = AVAudioEngine()
        let inputNode = audioEngine.inputNode 

	 // 11:08 - Other audio ducking
        do {
            try inputNode.setVoiceProcessingEnabled(true)
        } catch {
            print("Could not enable voice processing \(error)")
        }
        let duckingConfig = AVAudioVoiceProcessingOtherAudioDuckingConfiguration(enableAdvancedDucking: false, duckingLevel: .max)
        inputNode.voiceProcessingOtherAudioDuckingConfiguration = duckingConfig

話し手のミュートではリアルタイムでのミュートが可能になったようです。ここではAVAudioVoiceProcessingSpeechActivityEvent でイベントを検知し、自動ミュートの設定ができるようなコードになっています。

       // 12:31 - Voice activity detection - implementation with HAL APIs
        let listener =  { (event : AVAudioVoiceProcessingSpeechActivityEvent) in
            if (event == AVAudioVoiceProcessingSpeechActivityEvent.started) {
                // User has started talking while muted. Prompt the user to un-mute
            } else if (event == AVAudioVoiceProcessingSpeechActivityEvent.ended) {
                // User has stopped talking while muted
            }
        }
        inputNode.setMutedSpeechActivityEventListener(listener)
        // When user mutes
        inputNode.isVoiceProcessingInputMuted = true

公式: https://developer.apple.com/videos/play/wwdc2023/10235/

Add SharePlay to your app

SharePlayについてアプデートがありました。大きく2点のアップデートです。

  • サードパーティのアプリからSharePlayを利用できるように
  • AirDropでのSharePlayが可能に

今まではFaceTimeなどApple純正アプリでしか利用できなかったので、大きい進化ですね。

Discover how your app can take advantage of SharePlay to turn any activity into a shareable experience with friends! We'll share the latest updates to SharePlay, explore the benefits of creating shared activities, dive into some exciting use cases, and take you through best practices to create engaging and fun moments of connection in your app.

コードでは以前までのSharePlayと同様にGroupActivityを利用した設定をしています。
activityIdentifierでユニークなIdentifierを指定する必要があるようです。

    struct OrderTogether: GroupActivity {
        // Define a unique activity identifier for system to reference
        static let activityIdentifier = "com.example.apple-samplecode.TacoTruck.OrderTogether"

        // App-specific data so your app can launch the activity on others' devices
        let orderUUID: UUID
        let truckName: String

        var metadata: GroupActivityMetadata {
            var metadata = GroupActivityMetadata()
            metadata.title = "Order Tacos Together"
            metadata.subtitle = truckName
            metadata.previewImage = UIImage(named: "ActivityImage")?.cgImage
            metadata.type = .shopTogether
            return metadata
        }
    }

公式: https://developer.apple.com/videos/play/wwdc2023/10239/

Enhance your app’s audio experience with AirPods

AirPodsを活用してアプリのオーディオ体験を向上させる方法がアップデートされました
具体的にはAirPodsのiPhone/Mac間の自動切り替えやMute Controlのサポートが追加されています

Discover how you can create transformative audio experiences in your app using AirPods. Learn how to incorporate AirPods Automatic Switching, use AVAudioApplication to support Mute Control, and take advantage of Spatial Audio to create immersive soundscapes in your app or game.

AVAudioApplicationによってミュートの設定や検知ができるようになっています。

        // Adopting AVAudioApplication into your App
        import AVFAudio

        // Get the started instance
        let instance = AVAudioApplication.shared

        // Register for mute gesture notifications on Notification Center
        AVAudioApplication.inputMuteStateChangeNotification

        // Key for mute state
        AVAudioApplication.muteStateKey

        // Updating AVAudioApplication’s mute state
        instance.setInputMuted(...)

        // Reading AVAudioApplication’s mute state
        instance.isInputMuted

        instance.setInputMuteStateChangeHandler { isMuted in
            //...
            return didSucceed
        }

        // Optional: let CoreAudio mute your input for you (macOS only)
        // Define the Core Audio property
        var inputeMutePropertyAddress = AudioObjectPropertyAddress(
            mSelector: kAudioHardwarePropertyProcessInputMute,
            mScope: kAudioObjectPropertyScopeInput,
            mElement:kAudioObjectPropertyElementMain)

        // Enable this property when you want to mute your input
        UInt32 isMuted = 1; // 1 = muted, 0 = unmuted
        AudioObjectSetPropertyData(kAudioObjectSystemObject,
                                   &inputeMutePropertyAddress,
                                   0,
                                   nil,
                                   UInt32(MemoryLayout.size(ofValue: isMuted),
                                   &isMuted)

公式: https://developer.apple.com/videos/play/wwdc2023/10275/

Explore AirPlay with interstitials

AirPlayのオーディオ体験をより強化する方法についてアップデートがありました
AVQueuePlayerを使用した高度なオーディオバッファリングや、カスタムプレーヤーの構築が主なアップデートとなっています。

Learn how you can upgrade your app's AirPlay audio experience to be more robust and responsive. We'll show you how to adopt enhanced audio buffering with AVQueuePlayer, explore alternatives when building a custom player in your app, and share best practices.

AVQueuePlayerを利用したプレイリストの作成が例で挙げられています。

    let audioSession = AVAudioSession.sharedInstance()
    try audioSession.setCategory(. playback ,xmode: . default , policy:.longFormAudio )
        


    let player = AVQueuePlayer()

    let url = URL(string: "http://www.examplecontenturl.com")
    let asset = AVAsset(url: url)
    let item = AVPlayItem(asset: asset)

    player.insert(item, after: nil)
    player.play()

公式: https://developer.apple.com/videos/play/wwdc2023/10233/

まとめ

  • AVAudioEngineの強化で通話中のミュートや音を載せられる
  • Share Playの強化
    • サードパーティから使える
    • AirDropできる
  • AirPods/AirPlay利用時のアップデート
    • ミュートが設定や検知によってよりシームレスな体験になる?

宣伝

最後に宣伝ですが、音声アプリを作ってます〜使ってみてください〜✨


https://apps.apple.com/us/app/シンプル録音/id6443528409

speakerdeckの資料も併せてご覧ください
https://speakerdeck.com/entaku/what-s-new-in-voice-processingta-what-s-new-in-audio-27c1a770-f1da-4f51-954c-bfcc4d608b20

Discussion