LoginSignup
14
11

More than 5 years have passed since last update.

[Swift] たった1行で音声合成をする

Posted at

音声合成ライブラリ「AquesTalk」のiOS版には、xcodeで使えるフレームワークが含まれています。
これを用いれば、次のような1行で簡単に音声合成できます。

AquesTalk.play("ゆっくりしていってね?")

導入方法

フレームワークの追加とimportという通常のフレームワークの導入方法は必要ですが、それ以外はplayメソッド1行で音声合成できます。

1. フレームワークをプロジェクトに追加

AquesTalk iOSをダウンロードして、このzipファイルを展開しておきます。
ダウンロードしたパッケージ内のAquesTalk.frameworkを、
プロジェクトSetting画面>Generalタブ>Embedded Binariesに追加します。
この時、Copy items if neededをチェックし、フレームワークをプロジェクトにコピーする方が簡単です。

2. import

使用するクラスの先頭でAquesTalkフレームワークをimportします

ViewController.swift
import UIKit
import AquesTalk

3. playメソッドをコール

あとは、任意の場所にplayメソッドを記述するだけです。
引数の文字列には、漢字の文字列を記述できません。
かな表記の読み記号とアクセントなどで記述した音声記号列を指定します。

ViewController.swift
@IBAction func onPlayButton(sender: AnyObject) {
   AquesTalk.play("こんにちわ")
}

その他の機能

1. 話速を変える

引数speedに50から200までの値を指定して話す速度を変更できます。値を小さくすると遅くなります。デフォルトは100で省略できます。

'AquesTalk.play("ゆっく'り/はっせーしま'す", speed: 50)'

2. 発声を止める

メソッドstop()の呼び出しで、発声の途中で終了することができます。

3. 発声の終了タイミングを知る

引数notificationにNSNotificationを指定すると、発声終了のタイミングでそのNotificationが発生します。これにより、発声終了時に何か処理を行うことができます。
次のコードは、発声開始時にラベルを"Playing..."にし、発声終了後"Done"にする例です。

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        // Notificationの登録 発声終了を検知しなければ不要 selector(メソッド名)やnameは任意で
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.daDone(_:)), name: "AquesTalkDaDoneNotify", object: nil)
    }
    override func viewDidDisappear(animated: Bool) {
        super.viewDidDisappear(animated)
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }

    @IBAction func play(sender: AnyObject) {
        //終了通知イベントの作成 name部分はNSNotificationCenterに登録した値に合わせる
        let myNotifi: NSNotification = NSNotification(name: "AquesTalkDaDoneNotify", object: self, userInfo: nil)
        onPlayLabel.text = "Playing..."
        AquesTalk.play("こんにちわ、こんばんわ", notification:myNotifi)
    }

    // 発声終了後に呼ばれる
    func daDone(notification: NSNotification) {
        onPlayLabel.text = "Done"
    }

    @IBOutlet weak var onPlayLabel: UILabel!

4. その他

他には、発声中の有無を返すisPlay()メソッドや、音声再生せずにNSDataにwavフォーマットのデータを返すsynthe()メソッドがあります。

AquesTalk2 iOS

AquesTalkの兄弟分のAquesTalk2も同様の方法で使用できます。
AquesTalk2.frameworkでは、引数にphontnameというものが追加されており、ここに声種を指定すれば異なる声の種類で発声できます。例えば次の例では男声で発声します。

AquesTalk2.play("これわて'すとです", phontname: "aq_m5")

phontnameに指定できる種類は、AquesTalk2.framework内のphont.bundleを覗くとわかります。

Links

AquesTalk iOS 評価版ダウンロード
評価版は、ナ行、マ行がヌになる制限があります。個人が非営利で使う場合など、アクエストの個人利用の規定に従えば登録料のみで製品版のライブラリが入手できます。詳細はライセンスのページを参照。

音声記号列仕様書
playメソッドで読み上げる文字列(音声記号列)の書き方はここに規定されています。

14
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
11