[SwiftUI] AVSpeechSynthesizer로 TTS(Text To Speech) 구현하기 (1)

양재현·2026년 2월 16일

Apple의 AVFAudio 프레임워크 내 Speech Synthesis는 텍스트를 분석하여 인공적인 음성을 생성하는 강력한 기능을 제공한다. 이 글에서는 공식 문서를 바탕으로 가장 핵심적인 3가지 객체를 활용해 TTS 기능을 구현해 보겠다.

핵심 클래스

1. AVSpeechUtterance(대본) : 어떤 내용을 읽을지, 어떤 속도, 어떤 음높이로 읽을 지 등을 결정한다.

2. AVSpeechSynthesisVoice(성우) : 한국어 성우, 영어 성우 등 목소리를 결정한다.

3. AVSpeechSynthesizer(연출가) : 실제로 음성을 출력하고 제어(재생/일시정지/정지)하는 역할을 한다.


바로 코드 예제와 함께 보겠다.

SpeechManager

final class SpeechManager {
    
    static let shared = SpeechManager()
    
    private let synthesizer = AVSpeechSynthesizer() // 연출가 생성
    
    private init() {}
    
    // 1. AVSpeechUtterance(대본)
    private let text = "안녕하세요. SwiftUI에서 TTS를 테스트합니다."
    private var utterance: AVSpeechUtterance {
        let u = AVSpeechUtterance(string: text)
        u.rate = 0.5 // 말하기 속도
        u.volume = 1.0 // 음 높낮이
        
        // 2. AVSpeechSynthesisVoice(성우)
        u.voice = AVSpeechSynthesisVoice(language: "ko-KR") // 한국어 성우
        return u
    }
    
    // 3. AVSpeechSynthesizer(연출가)
    /// 재생
    func play() {
        if synthesizer.isPaused {
            synthesizer.continueSpeaking() // 일시정지 상태면 계속 진행
        } else {
            synthesizer.speak(utterance)
        }
    }
    
    /// 일시정지
    func pause() {
        synthesizer.pauseSpeaking(at: .word) //지금 읽고 있는 단어까지만 읽어
    }
    
    /// 정지
    func stop() {
        synthesizer.stopSpeaking(at: .immediate) //즉시 정지
    }
}

AVSpeechSynthesizer(연출가)를 먼저 불러온다. 그 후 AVSpeechUtterance(대본)을 보고 말하기 속도를 어떻게 가져가야 하는지, 음 높낮이는 어떻게 가져가야 하는지 성우를 위한 대본을 짜준다.
그러고 나서 AVSpeechSynthesisVoice(성우)를 한국인 성우로 모셔온다.

그 후 연출가에 지휘에 따라 성우가 대본을 읽던가 speak() 잠시 멈추던가 pauseSpeaking() 아예 멈추던가 stopSpeaking 할 수 있는 것이다.

(참고로 .word는 지금 읽고 있는 단어까지만 읽고 멈추고, .immediate는 즉시 멈춘다)

TestView

import SwiftUI

struct TestView: View {
    
    var body: some View {
        VStack(spacing: 30) {
            
            Button("재생") {
                SpeechManager.shared.play()
            }
            
            Button("일시정지") {
                SpeechManager.shared.pause()
            }
            
            Button("정지") {
                SpeechManager.shared.stop()
            }
        }
        .padding()
    }
}

#Preview {
    TestView()
}

이런식으로 SwiftUI에서 테스트 뷰를 통해서 TTS를 구현할 수 있다.



🍎 참고

https://developer.apple.com/documentation/avfaudio/speech-synthesis

0개의 댓글