WonderPlanet DEVELOPER BLOG

ワンダープラネットの開発者ブログです。モバイルゲーム開発情報を発信。

AVSpeechSynthesizerでSiriさんに読み上げてもらおう

今回のエンジニアブログ担当の近藤です。

ついこの前購入したSIMフリーのiPhone5sが届いて楽しくてしょうがないというわけで、
前回に引き続き、僕が気になっているiOS7の新機能を紹介します。

iOS7では新たに、「AVSpeechSynthesizer」というクラスが追加され、
これにより指定した文字列をSiriさんの声で読み上げてくれます。
なんだかとってもおもしろそう。

では、さっそくやってみましょう。

まずはプロジェクト作成

読み上げ機能はiOS7での新機能になるので、Xcode5を使いましょう。
ここではプロジェクトの種類はSingle View Applicationで作ります。

フレームワークの設定

フレームワークはAVFoundation.frameworkを指定します。
AVSpeechSynthesizerはこのフレームワークに含まれています。
1_framework

実装

//↓AVFoundationをインポートします  
#import "AVFoundation/AVFoundation.h"  
#import "ViewController.h"  
  
@interface ViewController ()  
@end  
  
@implementation ViewController  
  
- (void)viewDidLoad  
{  
    [super viewDidLoad];  
    // Do any additional setup after loading the view, typically from a nib.  
  
    [self speech];  
}  
  
- (void)didReceiveMemoryWarning  
{  
    [super didReceiveMemoryWarning];  
    // Dispose of any resources that can be recreated.  
}  
  
//読み上げてるメソッド  
- (void)speech  
{  
    AVSpeechSynthesizer* speechSynthesizer = [[AVSpeechSynthesizer alloc] init];  
    NSString* speakingText = @"こんにちは ワンダープラネットです。";  
    AVSpeechUtterance *utterance = [AVSpeechUtterance speechUtteranceWithString:speakingText];  
    [speechSynthesizer speakUtterance:utterance];  
}  
@end  

なんと!たったこれだけで、Siriさんがしゃべりました。
AVSpeechSynthesizerのインスタンスに読み上げてほしい文字列を設定したAVSpeechUtteranceを渡してるだけです。

AVSpeechUtteranceが持っているプロパティの値を変更することで、読み上げる速さなどを設定できます。
下記のようにちょっと書き加えてみましょう。

//読み上げてるメソッド  
- (void)speech  
{  
    AVSpeechSynthesizer* speechSynthesizer = [[AVSpeechSynthesizer alloc] init];  
    NSString* speakingText = @"こんにちは。";  
    AVSpeechUtterance *utterance = [AVSpeechUtterance speechUtteranceWithString:speakingText];  
    utterance.rate = AVSpeechUtteranceMinimumSpeechRate;        //読み上げる速さ  
    utterance.pitchMultiplier = 0.5f;                           //声の高さ  
    utterance.volume = 0.5f;                                    //声の大きさ  
    NSTimeInterval interval = 1;  
    utterance.preUtteranceDelay = interval;                     //しゃべりだす前のインターバル  
    utterance.postUtteranceDelay = interval;                    //しゃべり終わった後の次のメッセージをしゃべるまでのインターバル  
    [speechSynthesizer speakUtterance:utterance];  
  
    NSString* speakingText2 = @"ワンダープラネットです。";  
    AVSpeechUtterance *utterance2 = [AVSpeechUtterance speechUtteranceWithString:speakingText2];  
    utterance2.rate = AVSpeechUtteranceMinimumSpeechRate;        //読み上げる速さ  
    utterance2.pitchMultiplier = 0.5f;                           //声の高さ  
    utterance2.volume = 0.5f;                                    //声の大きさ  
    [speechSynthesizer speakUtterance:utterance2];  
}  

声を低くしてゆっくり話すように設定してみました。
なんだかSiriさんが老けた声になってしまいました・・・。

下記の項目を変更することで読み上げ方を設定することができます。

rate 読み上げる速さ。(0.0〜1.0)
pitchMultiplier 声の高さ。(0.5〜2.0)
volume 声のボリューム。(0.0〜1.0)
preUtteranceDelay 読み上げる前のインターバル(NSTimeIntervalで指定)
postUtteranceDelay 次の文章を読み上げるまでのインターバル(NSTimeIntervalで指定)

クラスリファレンスを見ると、言語設定などほかにもいろいろ設定ができる様ですので、
興味があればのぞいてみるといいでしょう。
AVSpeechUtterance Class Reference

読み上げ機能というと、視覚障害者向けの機能として利用されることが多いと思いますが、
使い方次第ではなにか面白いアプリになるかもしれないですね。
Siriさんの声で朝起こしてくれる目覚ましアプリとか・・・。