はじめに
こんにちは、プロダクトマネジメント部の髙橋です。
🎬 まずはこちらの動画をご覧ください。
ちなみに…このヌーマンの声もAIで作ってます。
かなり自然な音声ではないでしょうか。このブログでは、このような音声の作り方や、使用に至るまでの経緯についてお伝えします。
この記事はヌーラボブログリレー2025夏の5日目の記事として投稿しています。
目次
使用までの経緯
弊社サービスのユーザー調査で、サービスを説明するためのプロモーション動画を作ることになりました。
動画の内容は準備できたのですが、課題は 「ナレーションをどうするか」。
考えられる選択肢は大きく3つありました。
- プロのナレーターに依頼する
→ クオリティは高いけれど、コストや準備の手間が大きい。 - 自分の声で収録する
→ 最も手軽だけど、めちゃくちゃ恥ずかしい。これだけは絶対に避けたい。 - TTS(Text-to-Speech)で生成する
→ 手軽だが、既存サービスは棒読み感が強く、単調で聞いていて眠くなってしまう。さらに、棒読みや不自然な発音に気を取られて、本来集中してほしい動画の内容ではなく「声の違和感」に意識が奪われてしまう。
どの方法も一長一短。
そこで「生成AIを使って、雰囲気や声色までコントロールできるナレーションを作れないか?」と考えたのが今回の挑戦でした。
まず目的として
今回の動画の目的はシンプルです。
- サービスについて、ユーザーに「共感」してもらう
- どんなサービスかを「理解」してもらう
- 最終的に「使ってみたい」と思ってもらう
つまり、単に機能を紹介するのではなく、
「共感 → 理解 → 期待」 という感情の流れをつくることがゴールでした。
課題
ナレーションは文章以上に「声の雰囲気」が印象を左右します。
例えば、同じ文章でも:
- 明るくハキハキ → 期待感や前向きさを与える
- 落ち着いた低音 → 信頼感や安心感を与える
- 丁寧な説明口調 → 理解を助ける
従来のTTS(Text-to-Speech)は「声の種類」は選べても、
「共感できるか」「理解できるか」「使ってみたいと思えるか」 という目的に合わせた声色の設計までは難しいのが現状です。
今回のアプローチ
伝えたいことから逆算する
今回の調査で目指したのは「聞き手に共感・理解・期待を持たせる声」。
具体的にはこんなイメージです:
具体的にはこんなイメージです:
- Affect / personality(人柄): 親しみやすく、頼れるガイド。聞き手に寄り添いながら案内する存在。
- Tone(声のトーン): フレンドリーで明瞭、安心感を与える。落ち着いた雰囲気を保ちつつも、前向きさや期待感を自然に伝える。
- Pronunciation(話し方): はっきりと丁寧で安定しており、一文一文が聞き取りやすい。過度に演技的にならず、自然な会話調を意識する。
- Pause(一呼吸の置き方): 重要なポイントや理解してほしい部分の直後に短い間を置く。これにより情報が整理され、次の言葉に集中できる。
- Emotion(感情のニュアンス): 温かくサポートするような雰囲気で、聞き手に「共感されている」「理解できた」「ちょっと使ってみたい」と思わせる。
ツール構成
- 音声生成:OpenAI TTS API(モデル・声質指定)
- 動画作成:Keynoteのプレゼンテーションモードでスライド録画
- 編集:iMovieで音声と映像を合成
実装ステップ
今回はNode.jsで実装しました。
import 'dotenv/config'; import fs from "fs"; import path from "path"; import OpenAI from "openai"; // ファイル名に使えない文字を除去・整形する関数 const sanitizeFileName = (input: string): string => { return input .replace(/[\/\\:*?"<>|]/g, "") // 禁止文字を削除 .replace(/\s+/g, "_") // 空白をアンダースコアに .slice(0, 30) // 最大30文字に制限 .trim(); }; const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY_NULAB }); const generateTTSFromFile = async () => { await fs.promises.mkdir("voices", { recursive: true }); const text = await fs.promises.readFile("voice.txt", "utf-8"); const lines = text.split(/\r?\n/).filter((line) => line.trim() !== ""); const instructions = `Affect / personality: 親しみやすく、頼れるガイド。聞き手に寄り添いながら案内する存在。 Tone: フレンドリーで明瞭、安心感を与える。落ち着いた雰囲気を保ちつつも、前向きさや期待感を自然に伝える。 Pronunciation: はっきりと丁寧で安定しており、一文一文が聞き取りやすい。過度に演技的にならず、自然な会話調を意識する。 Pause: 重要なポイントや理解してほしい部分の直後に短い間を置く。これにより情報が整理され、次の言葉に集中できる。 Emotion: 温かくサポートするような雰囲気で、聞き手に「共感されている」「理解できた」「ちょっと使ってみたい」と思わせる。` for (const line of lines) { const sanitized = sanitizeFileName(line); const filename = path.resolve("voices", `${sanitized}.mp3`); console.log(`🎙️ Generating audio for: ${line}`); const response = await openai.audio.speech.create({ model: 'gpt-4o-mini-tts', voice: "sage", input: line, instructions, }); const buffer = Buffer.from(await response.arrayBuffer()); await fs.promises.writeFile(filename, buffer); console.log(`✅ Saved: ${filename}`); } }; generateTTSFromFile().catch(console.error);
GitHubリポジトリはこちら:generate-narration
ちなみに、手っ取り早く試したい!というかたはOpenAIが公式でツールを出しています。こちらは無料で使えるのでご興味ある方はお試しください!
OpenAI.fm
動作確認 & 編集
ユーザー調査用の動画はお見せできませんが、冒頭のヌーマンの動画のキャプチャと一緒にご紹介します。
- Keynoteで動画素材作成
- iMovieで音声差し込み
- 各所調整
- タイミング調整
- アニメーション追加
- SE追加など
まとめ
今回、生成AIを使ってプロモーション動画のナレーションを作るという取り組みをしてみて感じたのは、動画制作って想像以上に大変だということです。
音声を用意して、映像に合わせて編集して、細かいタイミングを調整して……。やってみて初めて、テレビディレクターやYouTuberといった人たちの凄さを実感しました。
同時に、作業の中でYouTubeでよく聞く効果音(SE)の出所を知れたのも面白い発見でした。身近で聞いていた音が、実はこんなところから来ていたのかと。
そして、今回の一番の収穫は、やはりAIナレーションの可能性です。声のバリエーションが豊富で、目的に合わせた”ぴったりな声”を作ることができます。クオリティもかなり高く、人間が話すときの細かな息継ぎまで再現されていました。おかげで「声」という大きなハードルが一気に下がり、動画を完成させることができました。
次に動画を作るときは、この経験を活かして「より伝わる動画」に挑戦してみたいと思います。
……とにかく、生成AIすごい!!
おまけ:声色・雰囲気比較
生成AIナレーションは、指示の書き方次第で驚くほど雰囲気が変わります。
どれくらい違うかをぜひ体感してみてください!
明るくハキハキ
指示
- Voice: 明るくハリのある声、若々しいトーン
- Tone: 前向きでエネルギッシュ
- Personality: 聞き手を巻き込む熱量と親しみやすさ
- Pronunciation: ハキハキ、強調部分は少し大げさに
- Phrasing: テンポよく、語尾を上げて盛り上げる
セリフ
「みなさん!お待たせしました!いよいよ、新しいサービスの登場です!
これで、あなたの毎日がもっとワクワクするはずです!」
落ち着いた低音
指示
- Voice: 落ち着いた低めの声
- Tone: 穏やかで安心感のあるトーン
- Personality: 信頼できるガイドのような存在感
- Pronunciation: ゆっくりめ、言葉を噛みしめるように
- Phrasing: 余白を持たせ、聞き手に寄り添うリズム
セリフ
「日々の業務、お疲れさまです。
このサービスは、あなたの負担を減らし、安心して仕事に取り組めるように設計されています。」
丁寧な説明口調
指示
- Voice: 明瞭で丁寧な声、やや高め
- Tone: 優しくフラット、聞き取りやすい
- Personality: 教室で教える先生のように親しみやすい
- Pronunciation: はっきり区切り、専門用語もわかりやすく
- Phrasing: ステップごとに区切って説明
セリフ
「まず、画面右上の『新規作成』ボタンをクリックしてください。
次に表示されるフォームに、タイトルを入力しましょう。」
番外編:世界征服を企む悪役
指示
- Voice: 低く響く声、誇張された演技
- Tone: 劇的で威圧感のあるトーン
- Personality: 自信満々で狂気を帯びた悪役キャラ
- Pronunciation: 強弱を極端に、笑いを交える
- Phrasing: ゆっくりと溜めてから爆発的に発声
セリフ
「フハハハ!ついに完成したぞ!
このサービスで、世界の仕事を我が手に収めてやる!」