Dify×Gemini 2.0で音声データを簡単文字起こし

## はじめに
この記事では、ノーコード/ローコードでLLMアプリを開発できるツール「Dify」を使ってGeminiモデルを呼び出し、音声データの文字起こしを自動化する手順を紹介します。

## Geminiのセットアップ

まずは、DifyでGeminiを利用するために必要なAPIキーの取得と設定を行います。

### Google AI StudioでGemini APIキーを作成する

[Google AI Studio](https://ai.google.dev/aistudio?hl=ja)にアクセスし、「Google AI Studioにログイン」をクリックします。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936046/ce3e7962-ab51-a903-aa7f-b8b8763b34a9.png)

左上の「Get API Key」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936046/64f25f46-9ad0-5dd4-0fa3-202b5cf36dae.png)

「APIキーを作成」をクリック後、新規もしくは既存のプロジェクトを選択してAPIキーを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936046/deb07ba7-216b-ce83-4ae5-0744ddd1e492.png)

生成が完了したら「コピー」をクリックすると、APIキーがクリップボードにコピーされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936046/599d5364-66b3-6799-0343-942cf1edef64.png)

以上でGemini APIキーの取得は完了です。

### DifyでGemini APIキーを設定する
[Dify](https://dify.ai/jp)にアクセスします。

「設定」→「モデルプロバイダー」へと進み、Geminiの「セットアップ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936046/ad1c142c-b428-ad18-9d32-268d1cc92d15.png)

先ほどコピーしたAPIキーを入力して「保存」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936046/a0aefd0c-1632-6c63-75d6-2c89169e648c.png)



## 音声データの文字起こし

次に、実際に音声データの文字起こしを実行するためのフローを作成します。

### チャットフローの作成

トップ画面に戻り、「最初から作成」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936046/7f8b6c3f-cf3c-b47c-65d7-67b6a46e4b33.png)

「チャットフロー」を選択し、アプリの名前を入力したら「作成する」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936046/86670efd-35dd-edaf-8474-847f3fd3af8d.png)

### 開始ノードの設定

作成したチャットフローが表示されたら「開始」ノードを選択し、入力フィールドの「＋」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936046/469d6a8a-055b-3857-2e8c-16381a8053d0.png)

開始ノードはユーザーの入力やアップロードされたファイルを受け取る役割を持っています。
入力フィールドで追加する情報の形式を設定して保存します。

- フィールドタイプ：単一ファイル
- 変数名：audio
- ラベル名：音声
- ファイルタイプ：音声

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936046/1bfc9aaf-1050-adeb-4e68-44d5475704fe.png)


これにより、ユーザーがアップロードした音声ファイルが`audio`変数で取得できるようになります。

### LLMノードの設定

続いて「LLM」ノードで使用するモデルとプロンプトを設定します。
今回は記事執筆時点で最新モデルのGemini 2.0 Flash Thinkingを使用します。

コンテキスト：`開始{x}audio`
SYSTEMプロンプト：
```
​受け取った内容を文字起こししてください。
適切な句読点や段落分けを行なってください。
文字起こしの内容のみ出力してください。
（コンテキスト）
```
ビジョン：`開始{x}audio`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936046/7d5af781-0db2-22f5-8dce-7def44570ea2.png)

### 機能設定

続いて、画面上部の「機能」を開いて「会話の開始」を有効にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936046/5cc6b56d-d6b3-8840-001d-b67857198632.png)

「会話の開始」では、チャットを開始したタイミングで表示するメッセージやボタンを設定できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936046/709a720a-e3ed-6181-36cc-7e3781b04743.png)

これで音声をアップロードして文字起こしを行う基本フローが完成しました。

## 動作確認
画面右上の「プレビュー」からテスト用のチャット画面を開き、任意の音声ファイルをアップロードします。
アップロードが完了したら「文字起こしする」ボタンをクリックして実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936046/2fa6ba14-81a4-1dae-2161-4a5321aaba2a.png)

以下はサンプル用の会議音声を文字起こしした例です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936046/dd3ec5c9-3f01-d31e-2bc6-d710a1b9000d.png)


:::note info
Difyにはプロンプトジェネレーターという便利な機能が用意されています。
これは簡単な指示をテキストで入力するだけで、Dify側が自動でプロンプトを生成してくれる機能です。
議事録作成や話者分離など、さらに高度なテキスト処理を行いたい場合には、ぜひこの機能を活用してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936046/bf26b0dc-59fc-016d-7045-9792d7e0a68e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936046/7b795239-7471-422e-1382-3d0b65b68468.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936046/32b5d931-d53a-e9bb-14f9-a359c763ac98.png)
:::

## まとめ

今回は、DifyとGeminiを組み合わせた音声文字起こしのフローを構築する手順をご紹介しました。
DifyはNotionなどの外部サービスとも連携できるので、さらに機能を拡張していくことも可能です。

今回作成したフローのDSLファイルは以下になります。
最後までお読みいただき、ありがとうございました。
```
app:
  description: ''
  icon: 🤖
  icon_background: '#FFEAD5'
  mode: advanced-chat
  name: Gemini 文字起こし
  use_icon_as_answer_icon: false
kind: app
version: 0.1.5
workflow:
  conversation_variables: []
  environment_variables: []
  features:
    file_upload:
      allowed_file_extensions: []
      allowed_file_types:
      - audio
      allowed_file_upload_methods:
      - remote_url
      - local_file
      enabled: true
      fileUploadConfig:
        audio_file_size_limit: 50
        batch_count_limit: 5
        file_size_limit: 15
        image_file_size_limit: 10
        video_file_size_limit: 100
        workflow_file_upload_limit: 10
      image:
        enabled: false
        number_limits: 3
        transfer_methods:
        - local_file
        - remote_url
      number_limits: 1
    opening_statement: 音声ファイルをアップロード後、クリックしてください。
    retriever_resource:
      enabled: false
    sensitive_word_avoidance:
      enabled: false
    speech_to_text:
      enabled: false
    suggested_questions:
    - 文字起こしする
    suggested_questions_after_answer:
      enabled: false
    text_to_speech:
      enabled: false
      language: ''
      voice: ''
  graph:
    edges:
    - data:
        sourceType: start
        targetType: llm
      id: 1735569214372-llm
      source: '1735569214372'
      sourceHandle: source
      target: llm
      targetHandle: target
      type: custom
    - data:
        sourceType: llm
        targetType: answer
      id: llm-answer
      source: llm
      sourceHandle: source
      target: answer
      targetHandle: target
      type: custom
    nodes:
    - data:
        desc: ''
        selected: false
        title: 開始
        type: start
        variables:
        - allowed_file_extensions: []
          allowed_file_types:
          - audio
          allowed_file_upload_methods:
          - local_file
          - remote_url
          label: audio
          max_length: 48
          options: []
          required: true
          type: file
          variable: audio
      height: 90
      id: '1735569214372'
      position:
        x: 77.60494773742568
        y: 282
      positionAbsolute:
        x: 77.60494773742568
        y: 282
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 244
    - data:
        context:
          enabled: true
          variable_selector:
          - '1735569214372'
          - audio
        desc: ''
        model:
          completion_params:
            temperature: 0.7
          mode: chat
          name: gemini-2.0-flash-thinking-exp-1219
          provider: google
        prompt_template:
        - id: b4249447-b2e5-4276-b643-6e2361638ed7
          role: system
          text: '​受け取った内容を文字起こししてください。

            適切な句読点や段落分けを行なってください。

            文字起こしの内容のみ出力してください。

            {{#context#}}'
        selected: false
        title: LLM
        type: llm
        variables: []
        vision:
          configs:
            detail: high
            variable_selector:
            - '1735569214372'
            - audio
          enabled: true
      height: 98
      id: llm
      position:
        x: 378.6101940965748
        y: 282
      positionAbsolute:
        x: 378.6101940965748
        y: 282
      selected: true
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 244
    - data:
        answer: '{{#llm.text#}}'
        desc: ''
        selected: false
        title: 回答
        type: answer
        variables: []
      height: 103
      id: answer
      position:
        x: 680
        y: 282
      positionAbsolute:
        x: 680
        y: 282
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 244
    viewport:
      x: 22.102506637340753
      y: -20.30268868260356
      zoom: 1.0213516550087547
```