ObjecTips

Swift & Objective-C で iOS とか macOS とか

Playground でオーディオ再生(音声読みあげ)をする

Playground を使って簡単なオーディオ再生のテストを行う。
スニペットを実行確認するのにいちいちダミーのアプリを作ったりしなくていいのが Playground の便利なところ。
Playground なので言語は Swift

まずババッと以下のコードを書いてみる。
オーディオファイルを用意したりするのも面倒なので簡単に AVSpeechSynthesizer を使ってテキスト読み上げを行う。

import UIKit
import AVFoundation

let string = "あのイーハトーヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモーリオ市、郊外のぎらぎらひかる草の波。またそのなかでいっしょになったたくさんのひとたち、ファゼーロとロザーロ、羊飼のミーロや、顔の赤いこどもたち、地主のテーモ、山猫博士のボーガント・テストゥパーゴなど、いまこの暗い巨きな石の建物のなかで考えていると、みんなむかし風のなつかしい青い幻燈のように思われます。"
let synthesizer = AVSpeechSynthesizer()
let voice = AVSpeechSynthesisVoice(language: "ja-JP")
let utterance = AVSpeechUtterance(string: string)
utterance.voice = voice
synthesizer.speakUtterance(utterance)

読み上げするのが日本語テキストのため AVSpeechSynthesisVoice を使って日本語の声を設定してやる必要があるのに注意。
(Playground では Mac のシステム環境に設定に関わらず en_US の Locale で動作するようで、en_US の声で日本語テキストを読み上げさせてもできない。)

と、このコードを実際に Playground で実行してみると一番最後の行を実行した時にすぐ処理が終了してしまい、音声読み上げがされないという事態に直面する。
ここが今回の肝で、Playground でオーディオ再生をするには XCPlayground module の XCPlaygroundPage クラスを使う。

import XCPlayground

XCPlaygroundPage.currentPage.needsIndefiniteExecution = true

これでOK

以下ドキュメントより

Set needsIndefiniteExecution to true to continue execution after the end of top-level code.


最終的な実装コードは以下
これで Playground 上でオーディオ再生(音声読みあげ)を実行確認する事ができる *1

*1:うまく再生されない場合は Playground のウィンドウ下部にある再生停止ボタンを押して処理を再実行させてみると良い