WWDC23セッション要約会 - What_s_new_in_voice_processing他What_s_new_in_Audioを解説
この記事は?
先日開催された Swift愛好会スピンオフ WWDC23セッション要約会 で登壇したWhat_s_new_in_voice_processing他What_s_new_in_Audioの解説記事です。
Swift愛好会スピンオフ WWDC23セッション要約会の詳細はこちらの記事に書かれています
記事の概要
- WWDC23で発表されたセッションのうち音声系の話を中心にまとめました
https://developer.apple.com/videos/audio-video
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利用時のアップデート
- ミュートが設定や検知によってよりシームレスな体験になる?
宣伝
最後に宣伝ですが、音声アプリを作ってます〜使ってみてください〜✨
speakerdeckの資料も併せてご覧ください
Discussion