AVSpeechSynthesizer: Making iOS Talk
이번 세션은 AVSpeechSynthesis를 사용해서 iOS와 대화하는 방법을 설명합니다. (근데 대화가 맞나?)
WWDC 영상 링크
https://developer.apple.com/videos/play/wwdc2018/236/
Apple Developer Documentation - avspeechsynthesizer
What and why
AVSpeechSynthesis는 iOS 기기에서 컴퓨터 합성 음성을 생성하기 위한 API입니다.
아래 상황에서 사용합니다.
- 발표 (Announcements)
- 보이지않는 인터페이스
- 교육 앱 등
예시 - 운동 중 오디오 업데이트 (→ 이게 정확히 무슨 상황인지는 모르겠네요. Nike Run Club에서 달릴 때 뭐라고 말하던데 그런 상황일까,,,)
AVSpeechSynthesis and Accessibility
AVSpeechSynthesis은 장애를 가진 많은 사용자들을 도울 수 있는 기술입니다.
하지만 VoiceOver를 대체할 순 없습니다. 왜일까요?
- 음성이 VoiceOver와 겹칠 수 있습니다.
- 점자 기기에 연결해서 사용할 수 없습니다.
→ 앱에 접근성을 부여하려면 UIAccessibility API를 사용하세요
AVSpeechSynthesis basics
Basics
AVSpeechSynthesizer 생성
음성이 끝날 때 까지 유지되도록 하는 것을 보장합니다.
- synthesizer가 할당 해제되면 음성이 취소됩니다.
let synthesizer = AVSpeechSynthesizer()
utterance 생성
1번에서 생성한 synthesizer에게 utterance를 전달합니다.
let utterance = AVSpeechUtterance(string: "Hello") synthesizer.speak(utterance)
AVSpeechSynthesis and Audio Sessions
AVAudioSession은 speak()
에서 자동으로 활성화됩니다.
AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, with: option)
- 다른 오디오와 혼합하려면
mixWithOthers
옵션을 사용합니다. - 다른 오디오를 피하려면
duckOthers
옵션을 사용합니다.
Callbacks
AVSpeechSynthesis에는 utterance의 생명주기에 대해 알리는 delegate 메소드들이 있습니다.
아래 optional 메소드를 참고하세요.
- Speech started : utterance를 얻을 수 있습니다.
- Speech finished
- Character range will be spoken : 이 메소드에서
NSRange
를 리턴하는데 NSRange에서 string range로 변환할 수 있습니다. - Speech paused
- Speech continued
synthesizer.delegate = self
func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didStart utterance: AVSpeechUtterance) {
print("Speech started")
}
func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didFinish utterance:AVSpeechUtterance) {
print("Speech finished")
}
func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, willSpeakRangeOfSpeechStringcharacterRange: NSRange, utterance: AVSpeechUtterance) {
guard let rangeInString = Range(characterRange, in: utterance.speechString()) else { return }
print("Will speak: \(utterance.speechString[rangeInString])")
}
Choosing the right voice
매우 많은 빌트인 음성들이 있습니다. (각 언어를 지원합니다.)
Siri 음성은 이 API를 통해서 사용할 수 없습니다.
사용자는 더 나은 질의 음성을 다운로드할 수 있습니다.
식별자(identifier)나 언어로 선택합니다.
언어 별로 사용자 기본 음성이 선택됩니다.
ex) 아래 스크린샷은 설정 > 손쉬운 사용 > 콘텐츠 말하기 > 음성 메뉴를 누르면 나오는 화면입니다.
이 화면을 생각하면 될 것 같습니다.
let utterance = AVSpeechUtterance(string: "Hello")
// 아래 코드는 식별자로 AVSpeechSynthesisVoice 를 초기화하는 예시입니다.
// Select an English (US) voice preferred by user (if no preference, default is used)
utterance.voice = AVSpeechSynthesisVoice(language: "en-US")
// 아니면 voice의 배열에서 인덱스로 접근해 identifier를 가져와서 초기화할 수 있습니다.
// Select the first voice
let allVoices = AVSpeechSynthesisVoice.speechVoices()
utterance.voice = AVSpeechSynthesisVoice(identifier: allVoices[0].identifier)
지원 언어 (2018년 기준 37개)
Rate, pitch, and volume
AVSpeechSynthesizer에서 사용할 수 있는 몇 가지 속성이 있습니다.
그 중 rate(속도), pitch(높낮이), volume(음량) 에 대해 보겠습니다.
Speech Rate
음성 속도는 0에서 1사이 값으로 조절할 수 있습니다.AVSpeechUtteranceDefaultSpeechRate
와 같은 상수도 있습니다.
let utterance = AVSpeechUtterance(string: "Hello")
utterance.rate = 0.75 // faster
utterance.rate = 0.25 // slower
utterance.rate = AVSpeechUtteranceDefaultSpeechRate
utterance.rate = AVSpeechUtteranceMaximumSpeechRate
Pitch and Volume
위 두 속성은 AVSpeechUtterance에서 사용할 수 있습니다.
rate와 동일하게 0에서 1사이의 값으로 설정할 수 있습니다.
AVSpeechUtterance의 volume을 낮추는 것은 시스템 볼륨에 영향을 주지 않습니다.
let utterance = AVSpeechUtterance(string: "Hello")
utterance.pitch = 1 // high pitched voice
utterance.volume = 0.25 // lower speech volume, does not affect system volume
Attributed strings
attributes를 사용해서 음성 생성을 커스터마이징할 수 있습니다.
그 중 IPA 표기법
에 대해 보겠습니다.
IPA 표기법
- International Phonetic Alphabet 약자
- 사용처 - 전문화된 이름, 고유 명사, 사업명 등
- 지원 언어 - en-US, en-AU, en-GB, de-DE, es-ES, es-MX, fr-CA, fr-FR, it-IT, ja-JP
- 예시 - iPhone = ˈa͡ɪ.ˈfo͡ʊn
아이폰은 고유 명사라고 할 수 있겠죠. 어떻게 iPhone이라는 단어를 발음하는 건지 알 수 있도록 IPA 표기법을 사용하는 것입니다.
다만 해당 표현은 키보드로 입력하기 어렵기 때문에 아이폰의 접근성 기능을 사용해서 가져올 수 있습니다.
IPA 표기법을 생성하는 방법
설정 > 손쉬운 사용 > 콘텐츠 말하기 > 발음으로 이동합니다.
발음 등록 화면에서 +를 눌러 화면으로 이동합니다.
문구를 입력하고
대체의 마이크 버튼을 눌러 해당 문구를 말합니다.
IPA 표기법 결과가 생성되었습니다!
하나씩 눌러 발음에 맞는 기호법을 선택해 저장하면 됩니다.3번에서 가져온 기호를 복사해 attribute의 value에 넣습니다.
let attributedString = NSMutableAttributedString(string: "Hello iPhone") attributedString.addAttribute(.accessibilitySpeechIPANotation, value: "ˈa͡ɪ.ˈfo͡ʊn", range: NSRange(location: 6, length: 6))) let utterance = AVSpeechUtterance(attributedString: attributedString)
Summary
- 적시에 음성을 추가하여 앱 경험을 향상시킵니다.
- 여러 언어와 음성을 사용할 수 있습니다.
- IPA 표기법과 함께 발음을 커스터마이즈하세요.
일주일정도 WWDC 영상 스터디를 쉬고 오랜만에 했는데 내용이 어려워서 힘들었다..
보통 스크립트 보기 전에 영상 보고 -> 스크립트 읽고 -> 해석하고 이런 순서로 하는데
너무 졸려서 영상보다 자고 읽다 자고 해석하다 자고, 그리고 내용도 어려웠다.
그래도 몇번 씩 같은 내용을 보다보면 아 이게 이거구나 하는 시점이 온다. (물론 해석이랑은 다른 이야기)
근데 WWDC를 보고나서 그 기술을 프로젝트에 적용해보면 좋을 것 같은데, 한번 보고 끝나는 지식으로 남는 것 같기도 해서 고민이다.
'Programming > WWDC' 카테고리의 다른 글
Visual Design and Accessibility - WWDC 2019 (0) | 2020.08.09 |
---|---|
WWDC20 Keynote Summary (0) | 2020.06.26 |
Accessibility Inspector - WWDC2019 (0) | 2020.06.21 |
What's New in AVAudioEngine 정리 - WWDC19 (0) | 2020.06.10 |
Embedding and Sharing Visually Rich Links 정리 - WWDC2019 (0) | 2020.05.31 |