Andrew Ng 先生の動画 (DeepLearning.AI) の文字起こしと翻訳してみた

# やること
- [Andrew Ng 教授](https://www.andrewng.org/) が Founder を務めている [DeepLearning.AI](https://www.deeplearning.ai/short-courses/) が新しく動画を3本公開しました
  - LangChain for LLM Application Development
  - How Diffusion Models Work
  - Building Systems with the ChatGPT API
- 何れも大規模言語モデル（LLM）を使用した、アプリケーション開発のオンライン講座になります
- ただし、現時点 (2023/6/4) で文字起こし機能（以下の青枠で囲った "TRANSCRIPT" ボタン）が使えないため、動画の文字起こしと、日本語への翻訳を Whisper と DeepL API を使って実施します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67194/1b8fe6d4-3dcc-6509-625e-18b50627d01d.png)


- 実行環境は、無料の Google Colaboratory 上で行います

# 概要
1. 動画のダウンロード & 音声データへ変換
2. 音声ファイルの文字起こし
3. テキストデータの翻訳
4. ファイル出力
5. 結果の確認

# 1. 動画のダウンロード & 音声データへ変換
- [動画](https://learn.deeplearning.ai/langchain/lesson/1/introduction)の右下「︙」を押下すると "Download" が選択できるので、これで動画ファイルをダウンロードします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67194/fbf4efa9-fd8d-6a38-3683-ca9a5bd4eb98.png)
- 全動画をダウンロードした後、これらを音声データに変換していきます
先にダウンロードしたファイル名の先頭に連番を付与しています（0_XXX.mp4, 1_YYY.mp4）
そのあと、私は [オーディオコンバータ](https://online-audio-converter.com/ja/) というサイトで mp4 -> mp3 ファイルへ変換しました
- この mp3 ファイルを Google Drive 上の任意のフォルダにアップロードしておきます
（後で Google Colab 上から利用します）

# 2. 音声ファイルの文字起こし
- 各 mp3 ファイルを OpenAI が公開している 自動音声認識システム（automatic speech recognition (ASR) system） である [Whisper](https://openai.com/research/whisper) を使って文字起こしします
- Google Colab を起動し、ランタイムのタイプを GPU へ変更しておきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67194/86e0c17c-c10a-2000-5432-2cadd2d433db.png)

- Whisper をインストールします
```bash
!pip install git+https://github.com/openai/whisper.git
```

- Whisper の文字起こしに使うモデルを選択します
今回は 'base' を使用していますが、[以下](https://github.com/openai/whisper#available-models-and-languages) のように複数のモデルがあります。
```python
model = whisper.load_model("base")
```
| Size | Parameters | English-only model | Multilingual model | Required VRAM | Relative speed |
| --- | --- | --- | --- | --- | --- |
| tiny | 39 M | tiny.en | tiny | ~1 GB | ~32x |
| base | 74 M | base.en | base | ~1 GB | ~16x |
| small | 244 M | small.en | small | ~2 GB | ~6x |
| medium | 769 M | medium.en | medium | ~5 GB | ~2x |
| large | 1550 M | N/A | large | ~10 GB | 1x |


- #1 で格納した mp3 ファイルのパスを取得します
Google Drive をマウントし、その後に mp3 の全ファイルのパスを取得します
```python
# mount google drive
from google.colab import drive
drive.mount('/content/drive')

# file path
files = glob.glob("/content/drive/My Drive/<#1のmp3ファイル格納先フォルダ>/*.mp3")
```

- 全ファイルの文字起こしを実施します
#1 でファイル名の先頭に連番を振っていましたが（0_XXX.mp3, 1_YYY.mp3）、この先頭の数字を results (dict 型) のキーとしています

```python
results = {}

# transcription of all file
for file in files:
    results[(os.path.basename(file))[:1]] = model.transcribe(file)
```

# 3. テキストデータの翻訳
- 文字起こしされたテキストデータを日本語に翻訳します
- 翻訳は、[DeepL](https://www.deepl.com/translator) が公開している「DeepL API Free」というAPI経由で利用できるサービスを使います
1か月に50万文字まで無料で翻訳できます
- 「DeepL API Free」を利用するためには、DeepL のアカウントを作成して API キーを取得する必要があるので、以下のサイトを参考にしました。

https://www.kkaneko.jp/ai/online/deeplapi.html

- DeepL をインストールします
```bash
!pip install --upgrade deepl
```

- 取得した API キーを使って、翻訳を実行します
Translator の使い方は [GitHub](https://github.com/DeepLcom/deepl-python#usage) を参照

```python
# preparing the translator
auth_key = "<DeepL API 認証キー>"
translator = deepl.Translator(auth_key)

results_ja = {}

# translation of all data
for key in results.keys():
    results_ja[key] = translator.translate_text(results[key]["text"], target_lang="JA").text
```

# 4. ファイル出力
- 結果をテキストファイルへ出力します
（英語の場合は「.」（ピリオド）の後、日本語の場合は「。」（読点）の後に改行を入れています）

- 出力先を指定（任意のフォルダ）
```python
# output path
out_path = "/content/drive/My Drive/<#1のmp3ファイル格納先フォルダ>/output-text/"
```

- 文字起こしした英語のテキストを音声データ別に出力
```Python
for key in results.keys():
    tmp = results[key]['text'].replace('. ', '.\n')

    with open(out_path + str(key) + "_en.txt", 'w', encoding='utf-8') as f:
        f.write(tmp)
```

- 文字起こし & 翻訳した日本語のテキストを音声データ別に出力
```Python
for key in results_ja.keys():
    tmp = results_ja[key].replace('。', '。\n')

    with open(out_path + str(key) + "_ja.txt", 'w', encoding='utf-8') as f:
        f.write(tmp)
```


# 5. 結果の確認

- ざっと見てみると、以下のような新しい単語？が正しく文字起こしされていないですが、概ねよさげな気がします。。。
    - Lanchane -> LangChain
    - LLO -> LLM
 
```text:0_en.txt
Welcome to this short course on Lanchane for large language model application development.
By prompting an LOM or large language model is now possible to develop AI applications much faster than ever before.
But an application can require prompting an LOM multiple times and parsing as output.
・・・
```

```text:0_ja.txt
大規模言語モデルアプリケーション開発のためのLanchaneに関するこのショートコースへようこそ。
LOMや大規模言語モデルをプロンプトにすることで、AIアプリケーションをこれまでよりずっと速く開発することができるようになりました。
しかし、アプリケーションでは、LOMを何度もプロンプトし、出力としてパースする必要があります。
・・・
```


# ソースコード (GitHub)
https://github.com/hiraku00/Transcription_and_Translation/tree/main

# (2023/06/06 追記) 各動画の翻訳結果

### LangChain for LLM Application Development<br>（LangChain による LLM アプリケーション開発）
0. [Introduction](https://aiblogging.net/2023/06/deeplearning-ai-langchain-llm-01/)
1. [Models, Prompts and parsers](https://aiblogging.net/2023/06/deeplearning-ai-langchain-llm-02)
2. [Memory](https://aiblogging.net/2023/06/deeplearning-ai-langchain-llm-03)
3. [Chains](https://aiblogging.net/2023/06/deeplearning-ai-langchain-llm-04)
4. [Question and Answer](https://aiblogging.net/2023/06/deeplearning-ai-langchain-llm-05)
5. [Evaluation](https://aiblogging.net/2023/06/deeplearning-ai-langchain-llm-06)
6. [Agents](https://aiblogging.net/2023/06/deeplearning-ai-langchain-llm-07)
7. [Conclusion](https://aiblogging.net/2023/06/deeplearning-ai-langchain-llm-08)

### How Diffusion Models Work<br>（Diffusion モデルの仕組み）
0. [Introduction](https://aiblogging.net/2023/06/deeplearning-ai-diffusion-model-01)
1. [Intuition](https://aiblogging.net/2023/06/deeplearning-ai-diffusion-model-02)
2. [Sampling](https://aiblogging.net/2023/06/deeplearning-ai-diffusion-model-03)
3. [Neural Network](https://aiblogging.net/2023/06/deeplearning-ai-diffusion-model-04)
4. [Training](https://aiblogging.net/2023/06/deeplearning-ai-diffusion-model-05)
5. [Controlling](https://aiblogging.net/2023/06/deeplearning-ai-diffusion-model-06)
6. [Speeding Up](https://aiblogging.net/2023/06/deeplearning-ai-diffusion-model-07)
7. [Summary](https://aiblogging.net/2023/06/deeplearning-ai-diffusion-model-08)


### Building Systems with the ChatGPT API<br>（ChatGPT API を使ったシステム構築）
0. [Introduction](https://aiblogging.net/2023/06/deeplearning-ai-chatgpt-api-01)
1. [Language Models, the Chat Format and Tokens](https://aiblogging.net/2023/06/deeplearning-ai-chatgpt-api-02)
2. [Classification](https://aiblogging.net/2023/06/deeplearning-ai-chatgpt-api-03)
3. [Moderation](https://aiblogging.net/2023/06/deeplearning-ai-chatgpt-api-04)
4. [Chain of Thought Reasoning](https://aiblogging.net/2023/06/deeplearning-ai-chatgpt-api-05)
5. [Chaining Prompts](https://aiblogging.net/2023/06/deeplearning-ai-chatgpt-api-06)
6. [Check Outputs](https://aiblogging.net/2023/06/deeplearning-ai-chatgpt-api-07)
7. [Evaluation](https://aiblogging.net/2023/06/deeplearning-ai-chatgpt-api-08)
8. [Evaluation Part I](https://aiblogging.net/2023/06/deeplearning-ai-chatgpt-api-09)
9. [Evaluation Part II](https://aiblogging.net/2023/06/deeplearning-ai-chatgpt-api-10)
10. [Summary](https://aiblogging.net/2023/06/deeplearning-ai-chatgpt-api-11)