🐷

高速で音声を文字起こしするDeepgramを試してみた

に公開

この記事は、Linc’well Advent Calendar 2025 12日目の記事です

https://qiita.com/advent-calendar/2025/linc-well

さて、今回は高速で音声の文字起こしができることで話題のDeepgramという音声AIのSpeech to Textを試してみました。

https://deepgram.com/

実際に使ってみていくつか良いなと感じたポイントがあったので、備忘録的にまとめておきます。

Deepgramで検証するまでの流れ

ここからは実際にDeepgramを使って文字起こしされるまでの流れをご紹介していきます。

文字起こしの検証はPlaygroundが用意されているのでそこから試すのがいいでしょう。
Playgroundを試すにはSign upが必要なのでまずSign upをします。Sign upをすると無料枠が200$もらえるのですぐに検証は開始できます。検証をする際にクレジットカード情報が不要なのは地味にありがたいです。
Speech to Textの検証ができるUIは以下のイメージで使いやすいUIが印象的でした。

それでは早速検証していきましょう。
まず日本語で検証するために以下を設定します。

  • Transcription mode: Prerecorded
  • Language: Japanese
  • Model: Nova 2

検証はMP3などの音声ファイルをアップロードするか、サンプルで用意されている「Phone Call...」を選択してRunをクリックするだけで文字起こしが試せます。

今回はサンプルファイルを利用して検証してみました。

文字起こしは6分の音声ファイルに対して、約3秒で結果を出力してくれます。
これは他のサービスと比較するとかなり早くこのパフォーマンスの良さがDeepgramの特徴でもあります。

文字起こしは以下のようなJSONで出力されます。
transcript フィールドに音声を文字起こしした結果がセットされています。

サンプルJSON(一部割愛)
{
  "metadata": {
    # 文字起こしに使ったモデルの情報が返る
  },
  "results": {
    "channels": [
      {
        "alternatives": [
          {
            "transcript": "お電話ありがとうございますalljapanエアライン担当西田がお受けいたしますこんにちは、あの森田隆規なんですけどこの絵ラインでチケットを買ったんですよはいありがとうございます今メールが来てキャンセルされたって書いてあるんですけどそれはどうなっの大変申し訳ございません。お客様、もう一度お名前を頂戴してもよろしいでしょうか。森田隆規です。森田隆規様ですね。お電話ありがとうございます。ではこちらで確認いたしますので森田様もしご予約番号がお分かりになられましたらお知らせいただけますでしょうかはい、えっとちょっと待ってください今開いていますはい、ありがとうございます。523。458です。458ですね。お調べいたします。お待ちくださいます。はい森田様私の方で確認できますのが5月6日東京羽田空港からロサンゼルスまでご予約をいただいておりますがこちらの便がですねあいにく欠航となりましてこちらのちょっと違う便に変更していただく形になりますがよろしいでしょうか違う便でもゴールデンウィーク中になりますかね。はい、あのですね、日にちの方は変わらず5月6日であの他の便を取らせていただきたいと思いますがよろしいでしょうか。あのお時間の方とかをお聞かせしてもいいですかはい、すいません。では確認いたしますので、ちょっとお待ちいただいてもよろしいでしょうか。はい、ありがとうございます。森田様。現在ご予約いただいております便ですが、こちらがですね10時15分発の便でありましてこちらの方で提案できます便がですね次の12時30分発の便になります。わかりました。こちらの便でご変更を承ってもよろしいでしょうか。はい、大丈夫です。森田様、あの申し訳ございませんが、ご一緒にご旅行される方のお名前も頂戴してよろしいでしょうか。はい、わかりました。えっと。はいよろしいですよ。はい。江戸たけしです。江戸たけし様ですね。はい。そうですね、江戸たけし様の同じく便を変更させていただく形になります。あのお席の方はまだ隣同士ですかね伊藤さんはい、ちょっとの確認をさせていただきますのでお待ちいただいてもよろしいでしょうか。伊藤はい、ありがとうございますはいえーとですね大変申し訳ございませんあのゴールデンウィーク中ということがありましてですねあのちょっとお隣に座っていただける席というのが現在準備ができなくてですね。お支払いしたんですけど席を選ぶ時にそれはお金の方は戻ってきますか。申し訳ございません。こちらですねはい確かに席の指定でこちらの方で別にお代金を頂戴しております。こちらの方で対策を考えさせていただきますのでちょっと一旦保留させていただきますお待ちくださいませ。わかりましたありがとうございます森田様今回は弊社の勝手な理由が問題であのキャンセルということでしたので、もしよろしければですね現在エコノミーでご予約をいただいておりますがプレミアムエコノミーの方へアップグレードをさせていただきまして森田様と江戸様両方お二人がお隣同士で座っていただけるように手配させていただきますがいかがでしょうか。お願いします。それでは森田様と江戸様ですね席は窓側と通路側どちらかをお選びいただけますがまず森田様のご希望を頂戴してもよろしいでしょうか僕は窓側でお願いしますはいでは森田様が窓側ですねはいそれでは江戸様は通路側でよろしかったでしょうか。はいお願いします。それではですね後ほどこちらの変更内容をメールにてお送りいたしますのでこちらの方でよろしかったでしょうかはいお願いします。本日はお電話ありがとうございました。私オールジャパンエアラインの西田が承りました。西田さんありがとうございます。すみまさんありがとうございます。失礼します。",
            "words": [
              {
                "word": "お",
                "start": 0.96,
                "end": 1.36,
                "confidence": 0.91503906
              },
              ...
            ]
          }
        ]
      }
    ]
  }
}

デフォルトだと話者分離はされないので、話者分離したい場合は Diarization のオプションを有効にしましょう。

スピーカーごとのテキストが必要ならさらに Paragraphs のオプションを有効にしましょう。

すると出力されるJSONに paragraphs フィールドが追加され、話者分離されたテキストやスピーカーごとのテキストが返るようになります。

話者分離が追加されたJSON(一部割愛)
{
  "metadata": {
    ...
  },
  "results": {
    "channels": [
      {
        "alternatives": [
          {
            ...
            "paragraphs": {
              # Diarizationを有効にすると話者分離されたテキストが返る
              "transcript": "\nSpeaker 0: お 電 話 ありがとうございます all japan エア ライン 担 当 西田 が お 受け い た し ます\n\nSpeaker 1: こんにちは 、あの 森 田 隆 規 な んですけど この 絵 ライン で チケット を 買っ た ん です よ は\n\nSpeaker 0: い ありがとうございます 今\n\nSpeaker 1: メール が 来 て キャン セル さ れ た っ て 書い て ある んですけど それ は どう な っ\n\nSpeaker 0: 大変 申し訳 ござい ま せ ん 。 お 客 様 、もう 一 度 お 名 前 を 頂 戴 し て も よろ し い で しょう か 。\n\nSpeaker 1: 森 田 隆 規 です。...",
              "paragraphs": [
                # paragraphsを有効にするとスピーカーごとにテキストが返る
                {
                  "sentences": [
                    {
                      "text": "お 電 話 ありがとうございます all japan エア ライン 担 当 西田 が お 受け い た し ます",
                      "start": 0.96,
                      "end": 8.42
                    }
                  ],
                  "speaker": 0,
                  "num_words": 18,
                  "start": 0.96,
                  "end": 8.42
                },
                {
                  "sentences": [
                    {
                      "text": "こんにちは 、あの 森 田 隆 規 な んですけど この 絵 ライン で チケット を 買っ た ん です よ は",
                      "start": 9.36,
                      "end": 17.965
                    }
                  ],
                  "speaker": 1,
                  "num_words": 20,
                  "start": 9.36,
                  "end": 17.965
                },
                ...
              ]
            }
          }
        ]
      }
    ]
  }
}

このようにPlaygroundからの検証は簡単に行うことができます。

さらにCODE SAMPLEも提供してくれているので、curlなどで外部からAPIをリクエストする検証も容易にできます。また、オプションを有効にしている場合、オプション付きのコードを用意してくれます。curlだと以下のようなコードが生成されます。

curl \
  -X POST \
  -H "Authorization: Token YOUR_SECRET" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://static.deepgram.com/examples/Bueller-Life-moves-pretty-fast.wav"}' \
  "https://api.deepgram.com/v1/listen?diarize=true&paragraphs=true&language=ja&model=nova-2"

TokenにはDashboardのCreate API Keyから生成したKeyのSecretを設定します。

これでAPIをリクエストする検証が行えます。
1点注意でCODE SAMPLEで指定された音声ファイルを利用してAPIをコールすると、JSONに含まれる文字起こし結果( transcript フィールド)は空文字で返ります。文字起こしの結果に空文字以外の文字列が返る検証がしたい場合は、ご自身でファイルを用意して検証するようにしましょう。

CODE SAMPLEで返却されるJSON(一部割愛)
{
  "metadata": {
    ...
  },
  "results": {
    "channels": [
      {
        "alternatives": [
          {
            "transcript": "",
            "confidence": 0.0,
            "words": [],
            "paragraphs": {
              "transcript": "\n",
              "paragraphs": []
            }
          }
        ]
      }
    ]
  }
}

Deepgramを使ってみた感想

同期処理によるパフォーマンスの高さ

Deepgramの大きな特徴はパフォーマンスの高さで、その速さによって同期的に処理できる点です。
リアルタイムで高速に文字起こしができるため、ユーザーを待たせることのないUXが提供できます。Deepgramで検証に使用したサンプルファイルをAssemblyAIでも試してみたのですが文字起こしされるまでに約1分かかりました。Deepgramは3秒で文字起こしされたのでDeepgramのパフォーマンスの良さがよくわかります。

コストが比較的安価

主要な音声文字起こしサービスのコストをまとめてみました。

サービス 5分の概算コスト
AWS Transcribe $0.024
Google Cloud Speech-to-Text v2 $0.08
Azure AI Speech $0.0167
AssemblyAI $0.0025
Deepgram STT $0.0052
OpenAI Whisper API $0.03

※2025年10月に調べた内容なのでご覧いただいている時期によっては内容が異なる可能性があります
※コストは契約形態で多少変わってきます

比較表を見ると、AssemblyAIが最も安価ですが、Deepgramも比較的安価です。
プロダクトで使うことを考えると、コストは重要な要素です。コストが安価だと気軽に検証できるので助かります。
また無料枠が200$あるのも嬉しいポイントです。

話者分離されたテキストの先頭に「。」や「、」がつく

日本語だとスピーカごとのテキストの先頭に「。はい、 ありがとうございます」のように句読点がつくことがありました。そのままのテキストを扱うと読みづらいので除去してあげるのが良いです。英語だと問題なかったので日本語特有の問題かもしれません。

デフォルトだと音声が学習に使われる可能性がある

MIP(モデル改善プログラム)に参加しない限りは学習されることはないとの記載があったのですが、念の為サポートに問い合わせをしました。すると学習されたくない場合はリクエスト時にmip_opt_out=trueを指定することを推奨するとの回答をいただきました。デフォルトでは学習されない記載にも解釈できますが、Deepgramをプロダクトに組み込む場合はmip_opt_out=trueを指定しておくのが無難そうです。
ちなみにmip_opt_outはUI上では指定できないので、Playgroundで検証する際は学習されたくないファイルのみで検証しましょう。

https://developers.deepgram.com/docs/the-deepgram-model-improvement-partnership-program#how-do-we-handle-your-data-and-ensure-security-and-privacy
https://developers.deepgram.com/docs/the-deepgram-model-improvement-partnership-program#want-to-opt-out

文字起こしの精度について

文字起こしの精度については扱うモデルにもよりますが、OpenAI WhisperやAWS Transcribeなど、他のサービスと比較してもそこまで大きな差は感じませんでした。
どのサービスも一定のレベルに達しているため、精度に関してはそこまで気にする必要はなさそうです。

まとめ

今回Deepgramを使った音声の文字起こしを試してみました。
実際に使ってみて、以下のようなケースに当てはまる場合はDeepgramを選定すると良いと感じました。

リアルタイム性が重要
同期処理で高速にレスポンスが返ってくるため、リアルタイム性を重視したいプロダクトと相性が良い

コストを抑えたい
比較的安価で、無料枠も200$あるため、スタートアップや検証フェーズでも導入しやすい

また、利用する際は以下の点に注意しましょう。

  • 日本語の話者分離ではテキストの先頭に句読点がつくことがあるため、後処理が必要
  • 学習に使われたくないデータを扱う場合は、mip_opt_out=true の指定をする

総合的に見て、コストとパフォーマンス、実装のしやすさのバランスが良く、プロダクトで使うには十分な選択肢だと感じました。

音声の文字起こしサービスを検討している方は、ぜひ参考にしてみてください。

Linc'well, inc.

Discussion