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