12/08/2018, 09:25

Tìm hiểu về AVSpeechSynthesizer

1. Giới thiệu về AVSpeechSynthesizer AVSpeechSynthesizer là một class của AVFoundation Framework, được Apple giới thiệu khi ra mắt hệ điều hành iOS 7 AVSpeechSynthesizer được sử dụng để "đọc văn bản", với đầu vào là 1 đoạn văn bản và đầu ra là âm thanh của văn bản đó Đầu vào của ...

1. Giới thiệu về AVSpeechSynthesizer

  • AVSpeechSynthesizer là một class của AVFoundation Framework, được Apple giới thiệu khi ra mắt hệ điều hành iOS 7
  • AVSpeechSynthesizer được sử dụng để "đọc văn bản", với đầu vào là 1 đoạn văn bản và đầu ra là âm thanh của văn bản đó
  • Đầu vào của AVSpeechSynthesizer là 1 hoặc nhiều đoạn văn bản khác nhau
  • AVSpeechSynthesizer có thể đọc, tạm dừng hoặc dừng hẳn văn bản đang đọc
  • Âm thanh đầu ra của AVSpeechSynthesizer có thể được config để thay đổi tốc độ, âm lượng,...
  • AVSpeechSynthesizer có thể config để đọc văn bản của nhiều nước khác nhau. Hiện tại, Synthesizing Speech đã hỗ trợ đọc văn bản của 37 nước khác nhau

2. Những thành phần chính của AVSpeechSynthesizer

Về cơ bản, AVSpeechSynthesizer bao gồm những thành phần chính sau

a. Tổng hợp lời (Synthesizing Speech)

AVSpeechSynthesizer sử dụng hàm sau để đọc văn bản

Swift

func speakUtterance(_ utterance: AVSpeechUtterance!)

OBJECTIVE-C

- (void)speakUtterance:(AVSpeechUtterance *)utterance

Trong đó, utterance là 1 đối tượng của AVSpeechUtterance class, đối tượng utterance lấy dữ liệu text và tổng hợp vào hàng đợi để đọc văn bản.

Ngoài text truyền vào đối tượng AVSpeechUtterance, chúng ta có thể gán các config về tốc độ, độ lớn,... của âm thanh đầu ra

b. Các hàm điều khiển speech (Controlling Speech Synthesis)

Khi đang đọc văn bản, AVSpeechSynthesizer cung cấp cho chúng ta method sau để tạm dừng việc đọc:

Swift

func pauseSpeakingAtBoundary(_ boundary: AVSpeechBoundary) -> Bool

OBJECTIVE-C

- (BOOL)pauseSpeakingAtBoundary:(AVSpeechBoundary)boundary

Giá trị boolean trả về là true nếu văn bản được dừng và false nếu văn bản không được dừng

boundary là đối tượng của AVSpeechBoundary class, có thể nhận giá trị là AVSpeechBoundaryImmediate hoặc AVSpeechBoundaryWord. Khi boundary nhận giá trị AVSpeechBoundaryWord, văn bản sẽ được dừng sau khi kết thúc chữ đang đọc dở, việc đọc văn bản sẽ ngừng ngay lập tức nếu boundary nhận giá trị AVSpeechBoundaryImmediate

Khi muốn dừng hẳn việc đọc văn bản, AVSpeechSynthesizer cung cấp cho chúng ta hàm sau để thực hiện việc dừng hoàn toàn việc đọc văn bản

Swift

func stopSpeakingAtBoundary(_ boundary: AVSpeechBoundary) -> Bool

OBJECTIVE-C

- (BOOL)stopSpeakingAtBoundary:(AVSpeechBoundary)boundary

Tương tự như hàm pauseSpeakingAtBoundary() ở trên, stopSpeakingAtBoundary() trả về giá trị boolean là true nếu văn bản đã được dừng, và false nếu văn bản không được dừng. Parameter boundary được nhận giá trị AVSpeechBoundaryImmediate hoặc AVSpeechBoundaryWord để văn bản dừng ngay lập tức hoặc dừng sau khi đọc hết chữ đang đọc dở

Khi việc đọc văn bản đang tạm dừng, chúng ta có thể tiếp tục đọc văn bản thông qua function sau

Swift

func continueSpeaking() -> Bool

OBJECTIVE-C

- (BOOL)continueSpeaking

Giá trị boolean trả về true nếu văn bản tiếp tục được đọc, false nếu văn bản không được tiếp tục đọc

c. AVSpeechSynthesizerDelegate và các hàm của AVSpeechSynthesizerDelegate

AVSpeechSynthesizer cung cấp cho chúng ta AVSpeechSynthesizerDelegate với những function sau

optional func speechSynthesizer(synthesizer: AVSpeechSynthesizer!, didStartSpeechUtterance utterance: AVSpeechUtterance!)

optional func speechSynthesizer(synthesizer: AVSpeechSynthesizer!, didFinishSpeechUtterance utterance: AVSpeechUtterance!)

optional func speechSynthesizer(synthesizer: AVSpeechSynthesizer!, didPauseSpeechUtterance utterance: AVSpeechUtterance!)

optional func speechSynthesizer(synthesizer: AVSpeechSynthesizer!, didContinueSpeechUtterance utterance: AVSpeechUtterance!)

optional func speechSynthesizer(synthesizer: AVSpeechSynthesizer!, didCancelSpeechUtterance utterance: AVSpeechUtterance!)

optional func speechSynthesizer(synthesizer: AVSpeechSynthesizer!, willSpeakRangeOfSpeechString characterRange: NSRange, utterance: AVSpeechUtterance!)

Tên các hàm của AVSpeechSynthesizerDelegate nói lên mục đích và ý nghĩa sử dụng của các hàm đó. Chúng ta có thể dùng AVSpeechSynthesizerDelegate để xử lý khi bắt đầu đọc, kết thúc việc đọc, sau khi tạm dừng việc đọc, sau khi tiếp tục việc đọc,...

Bằng việc cung cấp những hàm gọi và xử lý khá đầy đủ, đơn giản, giúp cho lập trình viên có thể dễ dàng tạo một ứng dụng đọc văn bản bằng AVSpeechSynthesizer mà không tốn nhiều thời gian. Phần tiếp theo, người viết xin giới thiệu một app demo nhỏ sử dụng AVSpeechSynthesizer

3. Demo app

Trong bài viết này, người viết sẽ sử dụng AVSpeechSynthesizer để tạo một app demo đọc văn bản đơn giản

Đầu tiên, mở Xcode, tạo 1 Single View Application, chọn ngôn ngữ sử dụng là swift -> done

Trong storyboard, chọn View Controller Scene rồi thêm vào 1 TextView và 3 button, đặt tên 3 button lần lượt là pause, speak và stop như hình sau

Screen Shot 2015-05-26 at 10.54.35 AM.png

Mở Assistant editor, kéo và tạo outlet cho TextView, tạo action cho 3 button pause, speak, stop

@IBOutlet weak var textView: UITextView!

@IBAction func handlePauseButtonClicked(sender: AnyObject) {
}

@IBAction func handleSpeakButtonClicked(sender: AnyObject) {
}

@IBAction func handleStopButtonClicked(sender: AnyObject) {
}

Chuyển sang file ViewController.swift, import AVFoundation framework

import AVFoundation

khai báo AVSpeechSynthesizer property:

let speechSynthesizer = AVSpeechSynthesizer()

trong viewDidLoad, thêm đoạn code sau:

self.textView.text = ""

Implement các action đã tạo cho các button bằng assistant editor ở trên:

@IBAction func handlePauseButtonClicked(sender: AnyObject) {
    speechSynthesizer.pauseSpeakingAtBoundary(AVSpeechBoundary.Word)
}

@IBAction func handleSpeakButtonClicked(sender: AnyObject) {
    if count(textView.text) > 0 {
        let speechUtterance = AVSpeechUtterance(string: textView.text)

        speechSynthesizer.speakUtterance(speechUtterance)
    }
}

@IBAction func handleStopButtonClicked(sender: AnyObject) {
    speechSynthesizer.stopSpeakingAtBoundary(AVSpeechBoundary.Immediate)
}

Vậy là project demo của chúng ta đã hoàn thành. Build chạy thử project, điền vào textview 1 đoạn text và thử các nút speak, pause hoặc stop để xem việc đọc văn bản của app.

4. Kết luận

Trên đây, người viết đã giới thiệu đến các bạn những thông tin cơ bản về AVSpeechSynthesizer, một class giúp việc tạo chức năng đọc văn bản trên hệ điều hành iOS trở nên vô cùng đơn giản. Người viết cũng đã gửi đến các bạn một demo vô cùng đơn giản của AVSpeechSynthesizer. Các bạn có thể đọc tài liệu về AVSpeechSynthesizer trên trang document của Apple tại đây

Cuối cùng, người viết xin cảm ơn các bạn đã theo dõi bài viết này!!!

0