【Swift5】 iOS에서 이용할 수 있는 표준 음성 합성(AVSpeechSynthesizer) 사용법의 메모

9496 단어 Swift5음성 합성

개요



표준으로 이용 가능한 음성 합성(AVSpeechSynthesizer)을 사용할 기회가 있었으므로, 비망록으로서 사용법을 정리합니다.

AVSpeechSynthesizer 공식 Doc
htps : //에서 ゔぇぺぺr. 아 ぇ. 코 m / 도쿠 멘 타치 온 / 아 v 후 우다 치 온 / 아 vs 페에 chsy 헉

AVSpeechSynthesizer는 텍스트 발화에서 합성된 음성을 생성하고 재생할 수 있는 객체입니다.
재생 중에 음성을 제어하는 ​​기능도 제공됩니다.

사용법


import AVFoundation

AVFoundation을 import하면 준비 완료.
let synthesizer = AVSpeechSynthesizer()

AVSpeechSynthesizer의 인스턴스를 생성합니다.

독서


let utterance = AVSpeechUtterance.init(string: "読み上げる文字列")
let voice = AVSpeechSynthesisVoice.init(language: "ja-JP")
utterance.voice = voice
synthesizer.speak(utterance)

읽을 때 AVSpeechUtterance를 설정합니다.
AVSpeechUtterance.init에 읽고 싶은 문자열을 전달하고 사용할 언어도 지정합니다.
위의 설정을 한 후에는 AVSpeechSynthesizer의 speak 메소드에 AVSpeechUtterance를 전달하면 읽기가 시작됩니다.

포즈


if synthesizer.isSpeaking {
    synthesizer.pauseSpeaking(at: .word)
}

읽는 동안 pauseSpeaking 메서드를 사용하여 읽을 수 있습니다.
인수에는 AVSpeechBoundary 상수(immidiate, word)를 지정할 수 있습니다.
immidiate는 발언을 즉시 일시 중지하고, word를 지정하면 현재 발화 중인 단어 뒤에 음성을 중지합니다.
덧붙여서, 현재 읽고 있는지 여부는 AVSpeechSynthesizer의 isSpeaking 메서드에서 확인할 수 있습니다.

※일본어라면 word 지정시의 정지의 틈이 부자연스러운 인상을 조금 받았습니다.

독서 중지


synthesizer.stopSpeaking(at: .immediate)

stopSpeaking 메서드를 사용하여 읽음을 중지할 수 있습니다.
pause와 마찬가지로 AVSpeechBoundary 상수(immidiate, word)를 지정할 수 있습니다.

독서 속도 지정


utterance.rate = 0.8

AVSpeechUtterance의 rate 속성을 지정하여 읽기 속도를 설정할 수 있습니다.
최대 속도와 최소 속도의 상수도 제공됩니다.
  • AVSpeechUtteranceMinimumSpeechRate
  • AVSpeechUtteranceMaximumSpeechRate

  • 독서 피치


    utterance.pitchMultiplier = 1.0
    

    속도와 마찬가지로 AVSpeechUtterance의 속성을 설정하여 피치(목소리 높이)도 설정할 수 있습니다.

    Delegate


    extension ViewController: AVSpeechSynthesizerDelegate {
        func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer,
                               didStart utterance: AVSpeechUtterance) {
            // 読み上げスタート
        }
    
        func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer,
                               didFinish utterance: AVSpeechUtterance) {
            // 読み上げ終了
        }
    
    
        func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer,
                               willSpeakRangeOfSpeechString characterRange: NSRange,
                               utterance: AVSpeechUtterance) {
            // 読み上げ中の発話
        }
    }
    

    AVSpeechSynthesizerDelegate를 구현하여 읽기를 처리할 수 있습니다.
    didStart, didFinish 메소드로 읽기 시작과 끝을 감지 할 수 있으며 willSpeakRangeOfSpeechString에서 부분적으로 읽을 수있는 문자열을 얻을 수 있습니다.
    이것을 활용하는 것으로, 예를 들어 읽고 있는 캐릭터 라인을 부분적으로 색을 바꾸는 등의 구현을 실시할 수가 있습니다.
    var alreadyReadUtteranceString = ""
    
    / / ~~~~~ 省略 
    
    func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer,
                               willSpeakRangeOfSpeechString characterRange: NSRange,
                               utterance: AVSpeechUtterance) {
            let readingUtteranceString = (utterance.speechString as NSString).substring(with: characterRange)
            alreadyReadUtteranceString = alreadyReadUtteranceString + readingUtteranceString
            changeTextColorPartially()
        }
    
    / / ~~~~~ 省略
    
    func changeTextColorPartially() {
        let attrText = NSMutableAttributedString(string: label.text!)
        attrText.addAttribute(
            .foregroundColor,
            value: UIColor.red,
            range: NSMakeRange(0, alreadyReadUtteranceString.count)
        )
        label.attributedText = attrText
    }
    
    



    이상, AVSpeechSynthesizer의 사용법의 메모였습니다.

    좋은 웹페이지 즐겨찾기