1
1

1. はじめに

音声録音は、特に長いテキストやスクリプトの場合、非常に手間がかかる作業ですよね。
しかし、最近ではAI音声技術の進化により、手軽に高品質な音声を生成することが可能になりました。
今回は、AzureのAI Speechサービスを利用して、テキストから音声ファイルを生成する方法について詳しく解説します。
こちらにも詳しく掲載してますので、ぜひご参考ください♪
https://note.com/kii_genai/n/nd2cbf809e197

音声録音の手間とAI音声の利用のメリット

従来、ナレーションや音声ガイドを制作するには、声優やナレーターによる録音が必要でした。これには、録音スタジオの手配や長時間の録音作業、さらには編集作業が伴います。こうした作業は非常に時間とコストがかかり、特に個人や小規模プロジェクトでは負担が大きいです。

一方、AI音声を利用することで、テキストを入力するだけで自動的に音声を生成できるため、時間とコストを大幅に削減できます。また、最新のAI音声技術は非常に自然な発声を実現しており、まるで人が話しているかのような高品質な音声を生成することができます。

最近のAI Tuber調査とその影響

最近、AI Tuber(AIキャラクターによるYouTubeチャンネル)が人気を集めています。これらのチャンネルでは、AIが生成した音声を利用して様々なコンテンツを提供しており、その多くが視聴者から高評価を得ています。私もAI Tuberの調査を進める中で、AI音声の利便性と可能性に気付きました。

その中で、特に注目したのがAzureのAI Speechサービスです。無料で高品質な音声を生成できる点、そして直感的な操作が可能な点が魅力的でした。今回は、このAzure AI Speechサービスを使って、テキストから音声を生成する方法について詳しく説明していきます。

2. 無料で使えるAI音声サービスの比較

AI音声サービスには様々な種類があり、それぞれ特長や制約があります。この章では、代表的な無料で利用できるAI音声サービスを比較し、その利点と制約について詳しく見ていきます。

Style-Bert-VITS2

Style-Bert-VITS2は、高品質な音声を生成するAI音声サービスの一つです。多くのユーザーに利用されている理由は、その音声の自然さと表現力にあります。

  • 音声品質: 非常に自然で感情豊かな音声を生成します。AI特有の機械的な感じが少なく、人間らしい発声が特徴です。
  • 制限: 1回のリクエストで変換できるテキストには100文字の制限があります。長いテキストを変換する場合、テキストを100文字以下の小さなチャンクに分割して複数回リクエストを送る必要があります。これが手間となり、長文の音声合成には不向きです。

Google Cloud Text-to-Speech

Google Cloud Text-to-Speechは、Googleが提供するAI音声サービスで、多くの言語に対応しています。広く利用されているため、信頼性も高いです。

  • 音声品質: 高品質ですが、ややAI特有の機械的な発声が残ります。それでも、多くのシナリオで十分に使えるレベルです。
  • 制限: 無料枠内で利用できる文字数には制限がありますが、比較的多くの文字を一度に処理できます。具体的には、無料プランで月に100万文字まで利用可能です。また、様々な声のタイプや話者の選択が可能で、カスタマイズの幅が広いです。

Azure AI Speechサービス

Azure AI Speechサービスは、Microsoftが提供するAI音声サービスです。最近、特にその自然な音声品質が注目されています。

  • 音声品質: 非常に自然で人間らしい音声を生成します。特に「ja-JP-NanamiNeural」という日本語の音声は、非常に滑らかで自然な発声をします。この音声は、イントネーションや抑揚も自然で、長時間聞いても疲れにくいのが特徴です。
  • 制限: 無料枠として、1か月あたり50万文字まで利用可能です。また、1分あたり20トランザクション(音声変換リクエスト)の制限があります。この制限は、例えば、1分以内に20個の音声ファイルを生成できることを意味します。多くの用途では十分な範囲です。

詳細な比較と選択のポイント

項目 Style-Bert-VITS2 Google Cloud Text-to-Speech Azure AI Speech
音声品質 非常に自然で感情豊か 高品質だがやや機械的 非常に自然で滑らか
利用のしやすさ 100文字の制限があり手間 比較的多くの文字を処理可能 無料枠が広く制限も少ない
コストと制限 基本的に無料だが100文字の制限が手間 無料枠は月に100万文字まで、追加費用 無料枠は月に50万文字まで、1分あたり20トランザクションの制限

Azure AI Speechサービスは、音声品質の高さと使いやすさ、そして無料枠の広さから、多くのユーザーにとって最適な選択と言えるでしょう。特に、日本語音声の自然さが他のサービスと比べて非常に優れている点が魅力です。

3. Azure AI Speechサービスの利用方法

Azure AI Speechサービスを利用するためには、いくつかの準備が必要です。この章では、Azureアカウントの作成から必要なツールのインストールまで、ステップバイステップで説明します。

Azureアカウントとリソースの準備

まず、AzureのAI Speechサービスを利用するために、AzureアカウントとAzure AI Speechリソースを作成する必要があります。

Azureアカウントの作成手順

  1. Azureの公式サイトにアクセスし、画面右上の「無料で始める」をクリックします。
  2. 指示に従ってMicrosoftアカウントを作成するか、既存のアカウントでサインインします。
  3. 必要な個人情報や支払い情報を入力してアカウントを作成します。無料アカウントの場合、初回利用に限り一定のクレジットが提供されますので、最初の試用には費用がかかりません。

Azure AI Speechリソースの作成手順

  1. Azureポータル(https://portal.azure.com)にサインインします。
  2. 左上の「リソースの作成」ボタンをクリックします。
  3. 「Cognitive Services」を検索し、「Speech」を選択します。
  4. 「作成」ボタンをクリックし、以下の情報を入力します。
    • 名前: 任意のリソース名(例: MySpeechResource)
    • サブスクリプション: 作成したAzureアカウント
    • リージョン: 使用するリージョン(例: East US)
    • 価格レベル: F0(無料)プランを選択
  5. 設定を確認し、「作成」ボタンをクリックしてリソースを作成します。
  6. 作成が完了したら、リソースの「キー」と「リージョン」をメモしておきます。これらは後で必要になります。

必要なソフトウェアと環境設定

次に、プロジェクトをセットアップするためのソフトウェアと環境を準備します。ここでは、Node.jsを使ってスクリプトを実行します。

Node

.jsのインストール手順

  1. Node.jsの公式サイトにアクセスします。
  2. 「LTS(Long Term Support)」と表示されているバージョンをダウンロードしてインストールします。
  3. インストールが完了したら、コマンドプロンプト(Windows)やターミナル(Mac)を開き、以下のコマンドを実行して正しくインストールされたことを確認します。
    node -v
    npm -v
    

Visual Studio Code (VSCode)のインストール手順

  1. VSCodeの公式サイトにアクセスします。
  2. 最新バージョンをダウンロードしてインストールします。
  3. インストールが完了したら、VSCodeを開きます。
  4. 「ファイル」メニューから「新しいウィンドウ」を選択して、新しいプロジェクトを開始します。

4. プロジェクトのセットアップ

ここでは、Visual Studio Code (VSCode)を使って、Azure AI Speechサービスを利用するプロジェクトをセットアップする手順を説明します。

フォルダの作成と初期化

  1. フォルダの作成

    • コンピュータ上に新しいフォルダを作成します。ここでは、フォルダ名を「AzureSpeechProject」とします。
    • VSCodeを開き、上部メニューの「ファイル」から「フォルダーを開く」を選択し、先ほど作成した「AzureSpeechProject」フォルダを選択します。
  2. package.jsonの作成

    • VSCodeの画面下部にあるターミナルを開きます。ターミナルが表示されていない場合は、上部メニューの「表示」から「ターミナル」を選択します。
    • ターミナルで以下のコマンドを実行して、Node.jsプロジェクトを初期化します。
      npm init -y
      
      これにより、「AzureSpeechProject」フォルダ内に「package.json」ファイルが作成されます。このファイルは、プロジェクトの基本情報を保持します。
  3. 必要なパッケージのインストール

    • ターミナルで以下のコマンドを実行して、AzureのAI Speechサービスを利用するためのパッケージをインストールします。
      npm install microsoft-cognitiveservices-speech-sdk fs dotenv
      
      これにより、「microsoft-cognitiveservices-speech-sdk」(Azure AI Speech SDK)、「fs」(ファイルシステム)、「dotenv」(環境変数を読み込むためのパッケージ)の3つのパッケージがインストールされます。

環境変数の設定

次に、Azureのキーとリージョンを環境変数として設定します。これにより、コード内でこれらの情報を安全に使用できます。

.envファイルの作成手順

  1. VSCodeで「AzureSpeechProject」フォルダ内に「.env」という名前の新しいファイルを作成します。
  2. 「.env」ファイルに以下の内容を追加します。
    SPEECH_KEY=your_speech_key
    SPEECH_REGION=your_speech_region
    
    • your_speech_keyyour_speech_regionを、前章でメモしたAzure AI Speechリソースのキーとリージョンに置き換えてください。

スクリプトの作成

次に、テキストファイルを読み込み、音声を生成するスクリプトを作成します。

batchSynthesize.jsスクリプトの作成手順

  1. 「AzureSpeechProject」フォルダ内に「batchSynthesize.js」という名前の新しいファイルを作成します。
  2. 以下のコードを「batchSynthesize.js」ファイルに追加します。このコードは、テキストファイルを読み込み、音声を生成して保存するためのものです。
require('dotenv').config(); // 環境変数を読み込みます
const sdk = require("microsoft-cognitiveservices-speech-sdk"); // Azure Speech SDKをインポート
const fs = require("fs"); // ファイルシステムをインポート

const speechConfig = sdk.SpeechConfig.fromSubscription(process.env.SPEECH_KEY, process.env.SPEECH_REGION); // Azureのキーとリージョンを使用してSpeechConfigを作成
speechConfig.speechSynthesisVoiceName = "ja-JP-NanamiNeural"; // 使用する音声を設定

const inputFile = "input.txt"; // 入力ファイルの名前
const outputFile = "output.wav"; // 出力ファイルの名前
const CHUNK_SIZE = 1000; // チャンクサイズを設定

function splitText(text, maxLength = CHUNK_SIZE) {
    const chunks = [];
    let chunk = "";
    const sentences = text.split(/(?<=[。.!?])/); // 句点でテキストを分割
    
    for (const sentence of sentences) {
        if ((chunk + sentence).length <= maxLength) {
            chunk += sentence; // 現在のチャンクに文を追加
        } else {
            if (chunk) chunks.push(chunk); // チャンクを追加
            chunk = sentence; // 新しいチャンクを開始
        }
    }
    if (chunk) chunks.push(chunk); // 最後のチャンクを追加
    return chunks;
}

async function synthesizeSpeech(text) {
    return new Promise((resolve, reject) => {
        const synthesizer = new sdk.SpeechSynthesizer(speechConfig); // SpeechSynthesizerを作成
        synthesizer.speakTextAsync(
            text,
            result => {
                if (result.reason === sdk.ResultReason.SynthesizingAudioCompleted) {
                    resolve(Buffer.from(result.audioData)); // 成功した場合、音声データを解決
                } else {
                    reject(new Error(result.errorDetails)); // エラーが発生した場合、エラーを拒否
                }
                synthesizer.close(); // SpeechSynthesizerを閉じる
            },
            error => {
                reject(error); // エラーが発生した場合、エラーを拒否
                synthesizer.close(); // SpeechSynthesizerを閉じる
            }
        );
    });
}

function mergeWavBuffers(buffers) {
    const headerBuffer = buffers[0].slice(0, 44); // 最初のバッファからヘッダー情報を取得
    const header = {
        chunkSize: headerBuffer.readUInt32LE(4),
        subchunk2Size: headerBuffer.readUInt32LE(40)
    };

    const dataBuffers = buffers.map(buffer => buffer.slice(44)); // データチャンクのみを結合
    const mergedData = Buffer.concat(dataBuffers);

    header.chunkSize = mergedData.length + 36; // 新しいヘッダーサイズを計算
    header.subchunk2Size = mergedData.length;

    headerBuffer.writeUInt32LE(header.chunkSize, 4); // 新しいヘッダーを書き込む
    headerBuffer.writeUInt32LE(header.subchunk2Size, 40);

    return Buffer.concat([headerBuffer, mergedData]); // ヘッダーとデータを結合
}

async function main() {
    try {
        const text = fs.readFileSync(inputFile, 'utf8'); // テキストファイルを読み込む
        const chunks = splitText(text); // テキストをチャンクに分割
        const audioBuffers = [];

        for (let i = 0; i < chunks.length; i++) {
            console.log(`チャンク ${i + 1}/${chunks.length} を処理中...(約${chunks[i].length}文字)`);
            const audioBuffer = await synthesizeSpeech(chunks[i]); // 各チャンクを音声に変換
            audioBuffers.push(audioBuffer); // 音声データを追加
        }

        console.log("全てのチャンクの処理が完了しました。音声ファイルを結合しています...");
        const combinedBuffer = mergeWavBuffers(audioBuffers); // 全ての音声データを結合
        fs.writeFileSync(outputFile, combinedBuffer); // 結合した音声データをファイルに保存
        console.log(`音声ファイルが保存されました: ${outputFile}`);
    } catch (error) {
        console.error("エラーが発生しました:", error); // エラーが発生した場合に表示
    }
}

main(); // メイン関数を実行

入力ファイルの作成とスクリプトの実行

  1. 入力ファイルの作成

    • 「AzureSpeechProject」フォルダ内に「input.txt」という名前の新しいファイルを作成します。
    • 「input.txt」ファイルに、音声に変換したいテキストを記述します。例として、以下のテキストを追加します。
      
      
      こんにちは、これはAzure AI Speechサービスを使った音声生成のデモです。
      このサービスは非常に自然な音声を生成します。
      
  2. スクリプトの実行

    • VSCodeのターミナルで以下のコマンドを実行します。
      node batchSynthesize.js
      
    • スクリプトが実行されると、input.txtに記述されたテキストが音声に変換され、「output.wav」ファイルに保存されます。
    • スクリプトの実行が完了したら、生成された「output.wav」ファイルを任意の音声プレーヤーで再生して、生成された音声を確認します。

5. 終わりに

今回は、Azure AI Speechサービスを利用して、テキストから音声ファイルを生成する手順を詳しく説明しました。最後に、実際に利用してみた感想と、このサービスの利点についてまとめます。

実際の利用経験と音声生成の速さ

実際にAzure AI Speechサービスを利用してみると、非常に短時間で高品質な音声ファイルを生成できることが分かりました。例えば、3500文字程度のテキストを音声データに変換するのに、スクリプトの実行時間はわずか数分程度でした。この速さは、手動での音声録音や編集と比べると圧倒的です。

音声の精度と自然さ

生成された音声は非常に自然で、人間が話しているかのような滑らかな発音とイントネーションを持っています。特に、「ja-JP-NanamiNeural」の日本語音声は、その自然さとクオリティの高さで驚きました。これにより、プロのナレーションや音声ガイドと遜色ないクオリティの音声コンテンツを手軽に作成できます。

無料利用枠とその利点

Azure AI Speechサービスは、無料で利用できる枠が広いことも大きな利点です。1か月あたり50万文字まで無料で利用できるため、多くのプロジェクトで追加コストをかけずに利用できます。また、1分あたり20トランザクションという制限も、通常の利用範囲では十分な許容量です。この無料枠を上手く活用することで、コストを抑えながら高品質な音声コンテンツを作成することができます。

その他の音声サンプルの試用

Azure AI Speechサービスでは、「Speech Studio」というツールを使用して、他の音声サンプルを試すことができます。「Speech Studio」の音声ギャラリーにアクセスすると、様々な音声のサンプルを聞くことができ、自分のプロジェクトに最適な音声を選ぶことができます。個人的には、直紀さんの声が特に気に入りました。

結論

Azure AI Speechサービスを利用することで、手軽に高品質な音声を生成することができるため、様々な用途で活用できます。例えば、YouTube動画のナレーション、教育用の音声ガイド、ビジネスプレゼンテーションの音声補助など、幅広い分野で利用できます。特に、ナチュラルな音声生成と無料利用枠の広さから、個人や小規模プロジェクトにも非常に適しています。

今後も、さらに多くの音声サンプルを試しながら、自分のプロジェクトに最適な音声を見つけていきましょう。そして、AI音声技術を活用することで、より効率的で魅力的なコンテンツを作成していきましょう。

参考文献

  1. Azure AI Speechサービスの公式サイト
  2. Google Cloud Text-to-Speechの公式サイト
  3. Speech Studioの公式サイト
  4. Node.jsの公式サイト
  5. Visual Studio Codeの公式サイト

1
1
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
1
1