Programming/WWDC

AVSpeechSynthesizer: Making iOS Talk 정리 - WWDC18

devssun 2020. 7. 12. 23:32
728x90
반응형

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

  1. AVSpeechSynthesizer 생성

    • 음성이 끝날 때 까지 유지되도록 하는 것을 보장합니다.

      • synthesizer가 할당 해제되면 음성이 취소됩니다.

      let synthesizer = AVSpeechSynthesizer()

  2. 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 표기법을 생성하는 방법

  1. 설정 > 손쉬운 사용 > 콘텐츠 말하기 > 발음으로 이동합니다.

  2. 발음 등록 화면에서 +를 눌러 화면으로 이동합니다.

  • 문구를 입력하고

  • 대체의 마이크 버튼을 눌러 해당 문구를 말합니다.

  1. IPA 표기법 결과가 생성되었습니다!
    하나씩 눌러 발음에 맞는 기호법을 선택해 저장하면 됩니다.

  2. 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를 보고나서 그 기술을 프로젝트에 적용해보면 좋을 것 같은데, 한번 보고 끝나는 지식으로 남는 것 같기도 해서 고민이다.

반응형