サイトアイコン エンジニアの本気で稼ぐ不労所得戦略

swift5でゆっくりボイス(AquesTalk)を使ったiOSアプリ開発の方法

iosでゆっくりボイスを使ったアプリ開発



iPhoneでゆっくりボイスを使ったアプリ開発

みなさん、ゆっくりボイス使っていますか。

ゲーム実況や解説動画、幅広く使われているアレです。

動画を作ったことのある人なら、sofTalkというソフトを使ったことがあるんじゃないでしょうか。

ゆっくりボイスの正式名称は、AquesTalkです。

Aquestが開発している発声ライブラリですね。

AquesTalkを使って作られているソフトには、棒読みちゃんやsofTalkなどがあります。

今回は、AquesTalkライブラリを使ったiPhoneアプリの作り方を解説していきます。

実際にAquesTalkを使ったアプリを公開しているので、よければ使ってみてください。

Spot Guide – スポットガイド

無料posted withアプリーチ

AquesTalkライブラリについて

一言にAquesTalkと言ってもいろんな種類があります。

AquesTalkの種類

おそらく一番聴き慣れているゆっくりボイスは、AquesTalk1です。
他にもAquesTalk2や10の3種類あります。

それぞれどんな声なのかは、公式HPのAquesTalkオンラインデモで聞けます。

AqKanji2Koeというライブラリもありますが、これは漢字をかなに変換するライブラリです。
AquesTalk単体だと漢字を発音できないので、AqKanji2Koeで変換してから読み上げることになります。

今回は、一番馴染みのあるAquesTalk1とAqkanji2Koeをswift5(swiftUI)で使い、iPhoneで読み上げられるようにします。

AquesTalkライブラリはそこそこ古い

AquestTalk1は2011年に開発されたライブラリで、最終更新日時も古いです。
(最終更新日時、2016年)

なのでswiftではなく、Cで書かれています。

つまり、swiftからCのライブラリを使えるようにしなくてはいけません。

AquesTalkライブラリ導入方法

まずは、iOS版のAquesTalk1を公式ページからダウンロードしてきます。
ダウンロードできるのは、評価版です。

製品版を使うには、ライセンスを購入する必要がありますが、開発段階では評価版で大丈夫です。

評価版と製品版の違いは、評価版は「ナ行、マ行」の音韻がすべて「ヌ」になる制限があります。
(評価版を使ってめっちゃヌーヌー言ってもバグではないので安心してください。)

  1. ライブラリを取り込む
    ライブラリをダウンロードしてきたら、解凍して中に入っているAquesTalk_iPhone.hlibAquestTalkEva.aをプロジェクトのルートディレクトリにコピーします。

  2. 別途必要なライブラリを追加
    ライブラリAudioToolbox.frameworklibs++.tbdを追加します。
    追加方法は、画像の通りGeneral > Frameworks, Libraries, and Embedded Contentタブで追加を押して、検索すれば出てきます。

  3. Bridging-Header.hを作成する。

    swiftでCのライブラリをimportするために必要なヘッダーファイルで中身はこんな感じです。

    #ifndef Bridging_Header_h
    #define Bridging_Header_h
    
    #import <UIKit/UIKit.h>
    #import "AquesTalk_iPhone.h"
    
    #endif /* Bridging_Header_h */
  4. ヘッダーファイルのパスを設定
    追加したヘッダーファイルのパスを追加します。
    これも画像の通りですが、Build Settings > Swift Conpilerのところです。

これでライブラリの導入は完了です!

AqKanji2Koeライブラリの導入方法

次に、漢字変換ライブラリを導入していきます。

Talkと同様にAqKanji2KoeのiOSライブラリを公式ページからダウンロードしてきます。

  1. ライブラリを取り込む
    ライブラリをダウンロードしてきたら、解凍して中に入っているAqKanji2Koe.hlibAqKanji2Koe.aをプロジェクトのルートディレクトリにコピーします。
  2. Bridging-Header.hにAqKanji2Koe.hを追加する。
    #ifndef Bridging_Header_h
    #define Bridging_Header_h
    
    #import <UIKit/UIKit.h>
    #import "AquesTalk_iPhone.h"
    #import "AqKanji2Koe.h"
    
    #endif /* Bridging_Header_h */
  3. 辞書データを追加する
    ダウンロードしたデータのうちaq_dicをルートディレクトリにコピーします。

AquesTalkで読み上げてみる

続いて実際に読み上げを行うコードを実装していきます。
最初に完成品を書いておきます。

ContentView.swift

import SwiftUI

struct ContentView: View {
@ObservedObject let voice = Voice.instance

var body: some View {
  voice.play(input: "読み上げテスト、ゆっくりしていってね")
}

Voice.swift

import Foundation

class Voice : ObservableObject {
  static let instance = Voice() // シングルトン
  let _dir : String
  var _err = Array<Int32>(repeating: 0, count:1)
  var m_pAqTk: H_AQTKDA
  var m_pAqKanji2Koe: UnsafeMutableRawPointer

  init() {
    // 変換用開発ライセンスキーのセット
    AqKanji2Koe_SetDevKey("xxx-xxx-xxx");

    // AqKanji2Koeで変換に使う辞書読み込み(もうちょっと綺麗にできるはず)
    let dir = Bundle.main.path(forResource: "aq_dic/aqdic", ofType: "bin")!
    _dir = dir.replacingOccurrences(of: "/aqdic.bin", with: "")

    // AqKanji2KoeとAquesTalkのインスタンス生成
    m_pAqKanji2Koe = AqKanji2Koe_Create(_dir, &_err); // エラー未処理 エラーのときはNULLが戻る
    m_pAqTk = AquesTalkDa_Create(); // AquesTalkエンジンのインスタンス生成
  }

   func play(input : String) {
    // ここのサイズが足りないとメモリエラーになるので雑に大きめに取っておく(ちゃんとやるならサイズ考える)
    var output = Array<Int8>(repeating:0, count:input.utf8CString.count * 10)
    AqKanji2Koe_Convert(m_pAqKanji2Koe, input, &output, Int32(input.count) * 10); // 変換に使うバッファサイズも多めに取っておかないと途中で途切れる(ちゃんとやるならry)

    let iret = AquesTalkDa_Play_Utf8(m_pAqTk, output, 100, nil)
    if (iret != 0) {
      print("読み上げ失敗")
    }
  }
}

こんな感じで、使います。

細かく説明していきます。

// 変換用開発ライセンスキーのセット
AqKanji2Koe_SetDevKey("xxx-xxx-xxx");

ここでAqKanji2Koeのライセンスをセットしますが、評価版なので、このままで大丈夫です。
製品版ライセンスを購入したら、ここを書き換えるだけで、製品版として使えます。

(ライセンス書き換えで製品版になるのは、AqKanji2Koeだけなので、AquesTalkの製品版はライブラリ自体製品版に入れ替える必要があります。)

// AqKanji2Koeで変換に使う辞書読み込み(もうちょっと綺麗にできるはず)
let dir = Bundle.main.path(forResource: "aq_dic/aqdic", ofType: "bin")!
_dir = dir.replacingOccurrences(of: "/aqdic.bin", with: "")

漢字変換のための辞書を読み込みます。
AqKanji2Koeで入れた辞書を指定すれば大丈夫です。

// AqKanji2KoeとAquesTalkのインスタンス生成
m_pAqKanji2Koe = AqKanji2Koe_Create(_dir, &err); // エラー未処理 エラーのときはNULLが戻る
m_pAqTk = AquesTalkDa_Create(); // AquesTalkエンジンのインスタンス生成

AqKanji2KoeとAquesTalkのインスタンスを生成します。

func play(input : String) {
  // ここのサイズが足りないとメモリエラーになるので雑に大きめに取っておく(ちゃんとやるならサイズ考える)
  var output = Array<Int8>(repeating:0, count:input.utf8CString.count * 10)
  AqKanji2Koe_Convert(m_pAqKanji2Koe, input, &output, Int32(input.count) * 10); // 変換に使うバッファサイズも多めに取っておかないと途中で途切れる(ちゃんとやるならry)

  let iret = AquesTalkDa_Play_Utf8(m_pAqTk, output, 100, nil)
  if (iret != 0) {
    print("読み上げ失敗")
  }
}

実際に読み上げる部分です。
AqKanji2Koe_Convert()で漢字を仮名に変換して、AquesTalkDa_Play_Utf8()で読み上げを行います。

まとめ

AquesTalkとAqKanji2Koeをswift5で使う方法をまとめました。

今回は単純に読み上げるだけの実装を行いましたが、他にも途中で再生を止めたり、再生速度を変えたり色々できるので、その辺りはドキュメントを参考にしてください。

AquesTalk iOS ドキュメント
AqKanji2Koe iOS ドキュメント

また、Aquestの公式掲示板があるので、実装で困ったりしたら見てみると解決できるかもしれません。

iOSアプリ開発をするなら読んでおきたい書籍

150冊読んだエンジニア7年生がオススメする本当に役立つプログラミング本
7年で150冊以上のプログラミング本を読んだ自分が「本当に役立つ」技術書を厳選してオススメします!エンジニアを目指している人・プログラミングを学習したい人は参考になると思います。言語や分野別にオススメします。

プログラミングを効率的に学ぶには、Udemyがオススメです。
Udemyは、世界最大の教育プラットフォームで、動画でスキルを学ぶことができます。

【セール95%OFF】オンライン学習ならUdemyがオススメ【プログラミング・ビジネススキル】
オンライン学習ならUdemyが一番オススメです。その理由を徹底解説します。プログラミングやビジネススキル、YouTube、ブログなど副業で稼ぎたい人もUdemyならオンラインで挫折せずスキルを身に付けられます。

Webサービス・スマホアプリ・ゲーム開発に役立つプログラミングスキルはもちろん、ブログやYouTubeで稼ぐために必要な集客・ブランディングなどを学ぶことができます。

セール期間中は、95%OFFになったり、30日間の全額返金保証もついているので、お得に安心して利用できます。




モバイルバージョンを終了