iPhoneでゆっくりボイスを使ったアプリ開発
みなさん、ゆっくりボイス使っていますか。
ゲーム実況や解説動画、幅広く使われているアレです。
動画を作ったことのある人なら、sofTalkというソフトを使ったことがあるんじゃないでしょうか。
ゆっくりボイスの正式名称は、AquesTalkです。
Aquestが開発している発声ライブラリですね。
AquesTalkを使って作られているソフトには、棒読みちゃんやsofTalkなどがあります。
今回は、AquesTalkライブラリを使ったiPhoneアプリの作り方を解説していきます。
実際にAquesTalkを使ったアプリを公開しているので、よければ使ってみてください。
AquesTalkライブラリについて
一言にAquesTalkと言ってもいろんな種類があります。
AquesTalkの種類
-
- AquesTalk10
- AquesTalk2
- AquesTalk1
- AqKanji2Koe
- Talkだけだと平仮名しか読めないので、漢字を変換するライブラリ
おそらく一番聴き慣れているゆっくりボイスは、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を公式ページからダウンロードしてきます。
ダウンロードできるのは、評価版です。
製品版を使うには、ライセンスを購入する必要がありますが、開発段階では評価版で大丈夫です。
評価版と製品版の違いは、評価版は「ナ行、マ行」の音韻がすべて「ヌ」になる制限があります。
(評価版を使ってめっちゃヌーヌー言ってもバグではないので安心してください。)
-
ライブラリを取り込む
ライブラリをダウンロードしてきたら、解凍して中に入っているAquesTalk_iPhone.hとlibAquestTalkEva.aをプロジェクトのルートディレクトリにコピーします。 -
別途必要なライブラリを追加
ライブラリAudioToolbox.frameworkとlibs++.tbdを追加します。
追加方法は、画像の通りGeneral > Frameworks, Libraries, and Embedded Contentタブで追加を押して、検索すれば出てきます。
-
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 */
- ヘッダーファイルのパスを設定
追加したヘッダーファイルのパスを追加します。
これも画像の通りですが、Build Settings > Swift Conpilerのところです。
これでライブラリの導入は完了です!
AqKanji2Koeライブラリの導入方法
次に、漢字変換ライブラリを導入していきます。
Talkと同様にAqKanji2KoeのiOSライブラリを公式ページからダウンロードしてきます。
- ライブラリを取り込む
ライブラリをダウンロードしてきたら、解凍して中に入っているAqKanji2Koe.hとlibAqKanji2Koe.aをプロジェクトのルートディレクトリにコピーします。
- 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 */
- 辞書データを追加する
ダウンロードしたデータのうち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アプリ開発をするなら読んでおきたい書籍
プログラミングを効率的に学ぶには、Udemyがオススメです。
Udemyは、世界最大の教育プラットフォームで、動画でスキルを学ぶことができます。
Webサービス・スマホアプリ・ゲーム開発に役立つプログラミングスキルはもちろん、ブログやYouTubeで稼ぐために必要な集客・ブランディングなどを学ぶことができます。
セール期間中は、95%OFFになったり、30日間の全額返金保証もついているので、お得に安心して利用できます。