Watson STTの音声書き起こし機能をwatsonxの生成AIで強化してみた

## 目的
Watson STTでは音声書き起こしモデルの文書/単語登録によるカスタマイズが可能で、特定の業務や用途に特化させた書き起こしモデルを作成可能です。
(詳細は[こちら](https://qiita.com/dk5/items/3773beaed5474b6de2f8))

２種類のカスタマイズはそれぞれ下記の様な方法で行いますが、明らかに**単語登録のための労力が高い**ことが分かります。

- 文書の登録：テキストファイルとしてコピー＆ペーストした文書を、そのままWatson STTにAPIで与えるだけ (≒ほぼ自動)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172843/a56e36c2-0d64-997a-bf6e-0d1a9dae0df3.png)

- 単語の登録：固有名詞などについて、指定されたjsonのフォーマットで、読み方と表記を記載する (≒基本的に手動で定義)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172843/dd549c0f-bd0a-7047-5012-4dc0b485f8da.png)

通常のカスタマイズの流れはこんなイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172843/3843b634-b1c5-53b8-1b38-245b4c0debce.png)


このように労力のかかる「単語の登録」について、生成AIを使って効率化できないか？を試すことが本記事の目的です。

## 手順
### 前提
下記のSaaS製品の組み合わせで検証実施しました。
- 音声書き起こしエンジン：Watson Speech to Text (STT) 
    - 日本語LSMモデル (ja-jp) を使用
- 生成AI：watsonx.ai
    - Mistral Largeを使用

### ゴール
今回は、IBMが最近買収を発表したStreamSets (ストリームセット、と読みます) についての説明を書き起こせるか、をテーマに検証を行います。
参考文書としては下記ページの内容を利用します。
https://jp.newsroom.ibm.com/2024-07-09-IBM-Completes-Acquisition-of-StreamSets-and-webMethods,-Bolstering-its-Automation,-Data-and-AI-Portfolios
また、音声としては、上記ページから引用した下記文章を読み上げた音声ファイルとします※。
```
StreamSetsは、多種多様なデータに対応するため、IBMのAIおよびデータ・プラットフォームであるwatsonxに、クラウドベースのリアルタイム・データ・インジェスト機能を追加します。データの取り込みは、複数のソースから、大量のデータを一元化されたストレージに移動させ、他のシステムやアプリケーションで利用できるようにします。データが、ソースとターゲットの間を移動する際、StreamSetsの持つストリーミング・ツールは、更新されたデータを、リアルタイムでターゲット先に提供することが可能です。IBMがwatsonx.dataのプレミアム機能として組み込む予定の、ハイブリッドクラウドとマルチクラウドに対応した本製品は、オフセット処理や配信保証などの機能を通じて、お客様のストリーミング・データの活用（インジェストやエンリッチなど）を簡素化します。
```

※今回のケースでは、簡便のためにHPに記載の表現をそのまま読み上げ、かつHPの内容を文書として登録しています。
  一般には、全く同じ表現が音声と登録文書に含まれる場合、モデルの性能が上がりやすくなることがあります。

### 手順
今回は、下図のように、単語の登録に生成AIを活用し、極力人間が介在せずに書き起こし精度向上を行うことを目指します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172843/67363f90-21fd-3205-9154-cb1ebf6ddb19.png)


#### 0. カスタム前のモデルの性能を確かめる
まずはSTTのja-jpモデルに何もカスタマイズを加えず、性能を検証してみます。すると、下記の様な結果となりました。

```
ストリームセット渡したようなデータに対応するためＩＢＭのＡＩおよびデータプラットフォームであるｗａｔｓｏｎｘにクラウドベースのリアルタイムデータいいんですと機能を追加します
データの取り込みは複数のソースから大量のデータを実現化されたそれ時に移動させ他のシステムやアプリケーションで利用できるようにします
データがソースとターゲットの間を移動する際ストリームセットの持つストリーミングツールは更新されたデータをリアルタイムでターゲット先に提供することが可能です
ＩＢＭ方とＸ外データのプレミアム機能として組み込む予定のハイブリッドクラウドとマルチクラウドに対応した本製品はオフセット処理や配信保障などの機能を通じてお客様のストリーミングデータの活用印ですや縁日などを観測します
```
一般的な書き起こしエンジンでも良くある話ですが、製品名などの固有名詞、ならびに普段見かけない単語 (ex: エンリッチ) などがうまく書き起こせておらず、このままでは内容の本質がいまいち分からないですね。

#### 1. カスタマイズ用のSTTモデルを作成する
→ こちらの手順は、他の方が執筆された下記Qiita等をご参照ください。
参考例：https://qiita.com/ishida330/items/ecdaf246022c8e2cb1a4

#### 2. カスタムSTTモデルに文書を登録する


下記のようにtxtファイルを作成の上、カスタムモデルに登録します。この手順は前述のQiitaなどをご参照ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172843/a56e36c2-0d64-997a-bf6e-0d1a9dae0df3.png)

#### 3. カスタムSTTモデルに単語を登録する
ここが今回の肝です。[こちら](https://qiita.com/dk5/items/3773beaed5474b6de2f8)のQiitaの基準などを参考に、固有名詞などを記載したリストを下記の様なjsonファイルとして作成し、カスタムモデルに登録すれば良いのですが、手間はもちろんかかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172843/dd549c0f-bd0a-7047-5012-4dc0b485f8da.png)

今回は、楽をするために生成AIであるwatsonx.aiを活用したいと思います。

##### 3.1. 生成AIで単語辞書を作成する
watsonx.aiのMistralモデルを使って、単語辞書のjsonファイルを作成したいと思います。
例えば下記の様なプロンプトを使ってみます。

```txt:プロンプトサンプル
<生成AIモデルとして必要なプロンプトは割愛>

入力された文献を元に、音声認識のための単語辞書を指定されたフォーマットで作成してください。

# Steps
1. **理解確認**: まず、入力されたデータを読み、全体の内容を把握してください。
2. **辞書登録が必要な単語の検出**: 内容を理解した上で、ルールに基づく単語を抽出してください。
3. **辞書作成**: ルールに基づいた単語の抽出後、フォーマットに従って辞書を生成してください。

# Output Rules
- フォーマットで指定するように、辞書はjson形式で出力してください。
- 必要な要素は、word、display_as、sournds_likeの3つです。
- wordには、半角スペースや全角スペースを含まない、1つの単語が入ります。(1) 固有名詞ならびに (2) IT業界に固有の単語、を入れてください。(1) 「一般名詞ではないが、ある業界や業務などでは使われているはずの名詞」を入れてください。製品名や型番 (アルファベットや数字などで構成された文字数字の羅列) などがこれに該当します。 (2) 「日常の会話では使われないが、IT業界の業務では使われそうな名詞」を入れてください。
- display_asは、wordと同じで問題ありません。
- sounds_likeは、日本語でwordを読み上げた場合、どのような発声になるかをカタカナで書いてください。たとえばwordが「こんにちは」の場合、sounds_likeは「コンニチワ」となります。wordが「IBM Aspera」の場合、sounds_likeは「アイビーエムアスペラ」となります。読み方ではなく発声の仕方であることに注意してください。スペースは入れないでください。

# Output Format
{"words":[ 
{"word":"<wordを入れる>"        , "display_as":"<display_asを入れる>"        , "sounds_like":["<sounds_likeを入れる>"]},
{"word":"<wordを入れる>"        , "display_as":"<display_asを入れる>"        , "sounds_like":["<sounds_likeを入れる>"]},
・・・
  ]}

# Notes
- "# Output Format"はフォーマットの例示であるため、アウトプットには含めない
```

すると、下記の様なjsonが得られました。
```json:出力例
{
  "words": [
    {
      "word": "StreamSets",
      "display_as": "StreamSets",
      "sounds_like": ["ストリームセッツ"]
    },
    {
      "word": "IBM",
      "display_as": "IBM",
      "sounds_like": ["アイビーエム"]
    },
    {
      "word": "watsonx",
      "display_as": "watsonx",
      "sounds_like": ["ワトソンエックス"]
    },
    {
      "word": "watsonx.data",
      "display_as": "watsonx.data",
      "sounds_like": ["ワトソンエックスドットデータ"]
    },
    {
      "word": "DataStage",
      "display_as": "DataStage",
      "sounds_like": ["データステージ"]
    },
    {
      "word": "Databand",
      "display_as": "Databand",
      "sounds_like": ["データバンド"]
    },
    {
      "word": "GCP",
      "display_as": "GCP",
      "sounds_like": ["ジーシーピー"]
    },
    {
      "word": "Azure",
      "display_as": "Azure",
      "sounds_like": ["アジュール"]
    },
    {
      "word": "AWS",
      "display_as": "AWS",
      "sounds_like": ["エーダブリューエス"]
    },
    {
      "word": "インジェスト",
      "display_as": "インジェスト",
      "sounds_like": ["インジェスト"]
    },
    {
      "word": "エンリッチ",
      "display_as": "エンリッチ",
      "sounds_like": ["エンリッチ"]
    }
  ]
}
```

これはなかなかうまく拾えていそうです。

#### 3.2. 生成された単語辞書のダブルチェック
このままjsonを辞書登録して良いかを確認します。今回の中身を精査すると、下記のような誤りが1点あったので、訂正します。
※ StreamSetsと書いてストリームセットと読みます。人間でも知らないと読めないですよね。

```json:修正箇所
      "sounds_like": ["ストリームセッツ"]
      
      "sounds_like": ["ストリームセット"]
```

#### 3.3 STTのカスタムモデルをトレーニングする
方法はここでは割愛しますが、数分程度で完了します。
※ 辞書登録やトレーニングのステップではコストはかかりません

#### 4 結果を確認
トレーニングしたカスタムモデルで改めて実行を行い、同じ音声での書き起こしを確認してみました。　

```
StreamSetsは多種多様なデータに対応するためIBMのＡＩおよびデータプラットホームであるwatsonxにクラウドベースのリルタイムデータインジェスト機能を追加します
データの取り込みは複数のソースから大量のデータを一元化されたストレージに移動させ他のシステムやプリケーションで利用できるようにします
データがソースとターゲットの間を移動する際StreamSetsの持つストリーミングツールは更新されたデータをリルタイムでターゲット先に提供することが可能です
IBMがwatsonx.dataのプレミム機能として組み込む予定のハイブリッドクラウドとマルチクラウドに対応した本製品はオフセット処理や配信保証などの機能を通じてお客様のストリーミングデータの活用ｉｎですやエンリッチなどを観測します
```
→ 今回はほぼ完璧に書き起こしが出来ていそうです。これだけ専門用語などを含む文書のカスタマイズを、ほぼ人手を掛けず、生成AIの待ち時間+αで実現出来るのはなかなか実用性の観点でも悪くないかと感じます。

#### 補足
ちなみに、手間のかからない「文書登録」だけのトレーニングでは下記の様な結果でした。
```
ストリームセットは多種多様なデータに対応するためＩＢＭのＡＩおよびデータプラットホームであるまたそのｘにクラウドベースのリルタイムデータ印字スト機能を追
データの取り込みは複数のソースから大量のデータを一元化されたストレージに移動させ他のシステムやプリケーションで利用できるようにします
データがソースとターゲットの間を移動する際ストリームセットの持つストリーミングツールは更新されたデータをリルタイムでターゲット先に提供することが可能です
ＩＢＭ方とｘをとデータのプレミム機能として組み込む予定のハイブリッドクラウドとマルチクラウドに対応した本製品はオフセット処理や配信保証などの機能を通じてお客様のストリーミングデータの活用ｉｎですや縁日などを観測します
```
→ 文章としての可読性は改善されていますが、やはり専門用語の表記などを中心に改善の余地がありますね。

「単語登録」だけでは、以下のような結果でした。
```
 StreamSets渡したようなデータに対応するためIBMのＡＩおよびデータプラットホームであるwatsonxにクラウドベースのリアルタイムデータインジェスト機能を追加します
データの取り込みは複数のソースから大量のデータを一元化されたそれ時に移動させ他のシステムやアプリケーションで利用できるようにします
データがソースとターゲットの間を移動する際StreamSetsの持つストリーミングツールは更新されたデータをリアルタイムでターゲット先に提供することが可能です
IBMがwatsonx.dataのプレミアム機能として組み込む予定のハイブリッドクラウド止まる千倉度に対応した本製品はオフセット処理や配信保障などの機能を通じてお客様のストリーミングデータの活用いんですや縁日などを観測します
```
→ 逆に専門用語の表記は改善されていますが、日本語の文章としての可読性がまだまだですね。

→ やはり「文書登録」「単語登録」を両方行うことが効果的であると言えそうです。

## まとめ
Watson STTのカスタマイズ機能ならびに生成AIを活用することで、人間側の作業を大幅に削減しつつ書き起こし精度の向上を図ることができました。
例えば組織内に溜まっている過去の議事録や技術文書、社外向けのHPなど、専門用語などを含み、今回の各種辞書に役立ちそうな文書の例は多く挙げられます。これらをベースに、社内会議における議事録の書き起こしの高精度化などに役立てることが出来そうです。
もちろん、実際の運用における考慮点は本記事以外にも挙げられます。とはいえ本記事の内容が、音声書き起こしに関する良くある課題に対する何らかのブレークスルーになればと思います。