たくあんおいしいのブログ

たくあんを食べながらプログラミングとかしますよ

AVSpeechSynthesizerとAVAudioRecorder・AVAudioPlayerを一緒に使おうとしたら躓いた

iOSで音声の録音・再生をするAVAudioなんちゃらを使ってアプリを書いてた。

この記事 iPhoneで録音再生する | matsuhouse のコードを丸々コピペで書いてちゃんと動いた。
やったぜ。と思ったが、さらに同アプリ内でAVSpeechSynthesizerを使ってSiriさんにテキスト読み上げをしてもらおうと思ったら困った。

テキスト読み上げはこの記事 AVSpeechSynthesizer による音声読み上げ を参考にやはりコピペして、一見ちゃんと動いてるように思われたが、
「AVSpeechUtteranceのインスタンスを生成する→AVAudioRecorderで録音する→AVSpeechSynthesizerで合成音声を再生する」
という順番で操作すると、最後のAVSpeechSynthesizerで合成音声を再生するというところで音が出ない!
別に例外を吐くとかエラーが返ってくるとかではなく動いてるかのように見えて音が出ないという事態に見舞われた。

原因は、この記事iPhoneで録音再生する | matsuhouseの③再生のコード
audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryAmbient error:nil];
こいつだった。
AVSpeechSynthesizer による音声読み上げの合成音声再生処理のところにはこの2行が書いてなかったのでAVSpeechSynthesizerとAVAudioSessionは関係ないのかと思っていたが、どうもAVAudioPlayerと同様に、AVSpeechSynthesizerで再生する前にもこの2行を実行しておく必要があるらしい。

もっとちゃんとした原因は調べてないのでわからないが、対処はできたのでよしとする。