Flutter で自然な声の音声読み上げ
Flutter で音声読み上げといえば、スマホ自体の声で話す flutter_tts プラグインが一般的です。オフラインで無料ですが、声は端末ごとに変わり、ブランドやキャラクターらしい声になることはまずありません。
無料の SuperClonica エンジンなら、どのスマホでも同じ自然な声をアプリに持たせられます。方法は2つ。アプリに同梱する事前音声化ファイルか、アプリが呼び出す音声サーバーです。このガイドでは両方を Dart のコード付きで紹介し、flutter_tts で十分な場面も説明します。
Flutter アプリを話させる3つの方法
多くのアプリは組み合わせます。UI にはアセット、ユーザーのテキストにはサーバー、予備にシステムの声。
- flutter_tts:スマホに入っている声。オフラインで無料ですが、端末ごとに違います。
- 事前音声化アセット:決まったセリフを SuperClonica で一度音声化してアプリに同梱。
- 音声サーバー:変わるテキストはアプリが SuperClonica サーバーに送り、返ってきた音声を再生。
- SuperClonica は31言語を話します。中国語にはまだ対応していません。
無料でオンラインで声を選ぶ
どの声のページでも、アプリのセリフを30〜100文字で入力し、言語を選んで生成ボタンを押します。数秒でアプリに合う声かが分かります。アカウント不要で、スマホからも使えます。
音声化したセリフをアセットで同梱
MP3 ならアプリは軽いまま。1文のセリフは数十 KB です。
- PCでエンジンを使ってセリフを音声化:python -m pip install superclonica-cpu のあと、superclonica --text "おかえりなさい!" --voice F1 --lang ja --output assets/voice/welcome.mp3。
- pubspec.yaml の flutter: assets: にフォルダーを登録します。
- audioplayers パッケージで再生:await AudioPlayer().play(AssetSource('voice/welcome.mp3'));
- アセットはオフラインで遅延もありませんが、変更のたびにアプリの新バージョンが必要です。
自前の音声サーバーを呼ぶ
自分で管理するマシンでサーバーを動かします:docker run -d -p 8000:8000 -v superclonica-models:/models superclonica/superclonica:cpu。iOS と Android が既定で求める HTTPS の内側に置き、SUPERCLONICA_API_KEY を設定して自分のアプリだけが使えるようにします。http、path_provider、audioplayers パッケージを使えば、セリフ1つがリクエスト1回です:final res = await http.post(Uri.parse('https://tts.example.com/synthesize'), headers: {'Content-Type': 'application/json'}, body: jsonEncode({'text': 'ご注文の商品を発送しました。', 'voice': 'F1', 'lang': 'ja'})); final file = File('${(await getTemporaryDirectory()).path}/line.wav'); await file.writeAsBytes(res.bodyBytes); await AudioPlayer().play(DeviceFileSource(file.path)); キーを Authorization: Bearer ヘッダーで付け、くり返すセリフのファイルはキャッシュしましょう。
flutter_tts で十分なとき
通知の読み上げ、アクセシビリティ補助、プロトタイプ、ネットなしで話す必要があり決まったセリフがないアプリなど、声が「伝わればよい」なら flutter_tts で十分です。家庭教師、ゲームキャラクター、ガイド付き瞑想、どのスマホでも同じ声で聞こえるべきブランドなど、声が製品の一部なら SuperClonica を選びましょう。