ハッカソンをもとに個人開発で「チャプター&要約自動生成してくれる動画共有アプリ」を開発した記録

# はじめに
私はオンラインITスクールRareTECHに所属しています。
そのスクール内で開催されるハッカソンに参加し動画チャプター自動生成アプリ「ちゃぷたん」を作りました。
github：https://github.com/hackathon-autumn-c/chaptan

そしてこの「ちゃぷたん」をもとに個人で開発を行い、チャプター&要約を自動生成してくれる動画共有アプリ「video-learn」を作りました。

:::note warn
現在アプリは公開していません
:::

<!--
:::note
チャプター&要約を自動生成してくれる動画共有アプリ「video-learn」公開中です。**月〜金の10-19時**に起動しています
サイト：https://video-learn.site
github：https://github.com/to-u-ko/video_learn
:::
-->


今回転職活動にあたってこのアプリをポートフォリオとして提出するため、ハッカソンと個人開発のそれぞれの開発記録を書きたいと思います。

この記事は個人開発の記録になります。
ハッカソンの開発記録→[2ヶ月間のハッカソンで動画チャプター自動生成アプリを作成した記録](https://qiita.com/ttookk/items/e3c2d2f46ec8ea541c36)

# アプリの概要と作成意図
私は動画学習があまり得意ではありません。
人それぞれ好む学習タイプがあるかと思いますが、私はテキストベースでの学習が最も頭に入りやすいと感じており、動画を要約してテキストで見ることができると嬉しいなという思いがありました。
そこで、自動要約生成とハッカソンで手掛けた自動チャプター生成を組み合わせて、動画学習が得意ではない人や効率よく動画学習を行いたい人のための"動画学習をサポートする動画共有サイト"を作ることにしました。
具体的にいうと「チャプター&要約を自動生成してくれる動画共有アプリ」です。

**■ターゲット(使用者)**
スクールの講師と生徒
**■課題**
動画学習が苦手な生徒や効率よく動画学習を行いたい生徒にとって、動画のチャプターや要約があると嬉しい。
しかし講師が毎回動画のチャプターや要約を生成するのは大変。
**■どのように解決するのか？**
「チャプター&要約を自動生成してくれる動画共有アプリ」があれば、動画をアップロードするだけでアプリ側でチャプターと要約を自動生成してくれるため、講師の負担なく生徒はチャプターごとの動画視聴や要約を読むことができ効率よく柔軟に学習を行うことができる。

# 使用技術・ツール
- バックエンド：Python(Django)
- データベース：MySQL
- フロントエンド：HTML/CSS/JavaScript
- デザイン：figma
- インフラ：AWS/Docker
- エディタ：VScode
- コード管理：git/github

# 機能
動画をアップロードすると自動でチャプターと要約を生成してくれる動画共有アプリです。
アプリの主要機能は以下の通りです。

:::note warn
※画像に映っている動画はデジタル庁のYoutubeの動画です。サンプルとして使用しています。
[デジタル庁｜年次活動報告　2023年9月](https://youtu.be/mkyBxjGb2RQ)
[「モビリティ・ロードマップ」のありかたに関する研究会（第６回）](https://youtu.be/vx1QrryxT2k)
:::

### 1. 動画のアップロード
動画をアップロードすることができます。
アップロードが完了するまで「アップロード中　お待ちください」の文字が表示されます。
アップロードが完了すると動画一覧画面に遷移します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852685/3a68a783-51a6-5de1-663b-1e0a4f512f10.png)


### 2. 動画一覧表示
アップロードされた動画が一覧で確認できます。
サムネイル表示とテーブル表示をボタンで切り替えることができます。
チャプターと要約の生成にはおよそ動画の1/4〜1/3の時間がかかります。
そのため「ステータス」の項目でチャプターと要約の生成状況が確認できるようにしています。
■サムネイル表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852685/87f83f45-0858-b6d1-4f19-a8c7a66feaba.png)

■テーブル表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852685/8255ed4f-8920-b200-6228-d7c11c779851.png)




### 2. チャプターの自動生成
動画がアップロードされると同時にチャプターが自動生成されます。
自動生成されたチャプターは動画の横に表示され、各チャプターをクリックするとその時点にジャンプして再生ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852685/390362c7-d5f7-59e6-449a-d891f18d23f8.png)


### 3. チャプターの編集
動画投稿者にだけチャプター編集ボタンが表示され、チャプターを編集することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852685/37650b8c-f0ac-dc21-4aa5-179289515c65.png)



### 4. 要約の自動生成
チャプターと同時に要約も自動生成されます。
要約ボタンを押すと要約のページに飛ぶことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852685/4fbd7458-0d2a-eaf0-91ca-bc5296092289.png)

### 5. 要約の編集
動画投稿者にだけ要約編集ボタンが表示され、マークダウン形式で要約を編集することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852685/ffaa7d4e-2d85-b2d3-3015-012ae6be03df.png)


ちなみに動画投稿者以外が無理やりチャプターや要約の編集画面にアクセスしようとすると、以下のようなメッセージが表示されアクセスできません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852685/25e66a79-7cff-4a43-5fa4-cc88289c6fd4.png)



### 6. 文字起こしのダウンロード
動画の文字起こしをテキストファイルとしてダウンロードすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852685/c71b95e9-1dd0-9173-40e4-dd01b98d5847.png)

### 7. 動画の削除
動画投稿者にだけ動作削除ボタンが表示されます。
ボタンを押すとモーダルが表示され、OKをするとS3に保存された動画ファイルと文字起こしファイル、データベースのレコードが消えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852685/47ec1aad-45b8-fc91-a9e7-74f1a3fdaa80.png)


### 8. ユーザーの切り分け
ユーザーは講師と生徒に分けられます。
■講師は動画のアップロード、視聴、文字起こしのダウンロード、チャプターの編集、要約の編集が可能です(編集は自分のアップロードした動画のみ可能)
■生徒は動画の視聴、文字起こしのダウンロード、要約の閲覧が可能です。

講師か生徒かによってサイトの表示を少し変えています。
生徒の画面ではナビゲーションバーに動画アップロードのメニューはありません。また、動画一覧画面ではステータスが完了(＝チャプター・要約生成済み)の動画のみ表示されるようになっており、ステータス項目は無意味なので非表示になっています。
【生徒の動画一覧画面】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852685/b97d701f-adf5-37ff-32a7-27ffe49670c7.png)



### その他の機能
- **ユーザー認証(ログイン・ログアウト)機能**
※学校や教育コミュニティ向けに作っており、誰もが自由にアカウントを作成するのではなく、管理者がアカウントを作成してユーザーに配布する形での使用を想定しています。そのため、自分でサインアップするための画面は用意していません。
- **動画一覧画面での動画の検索機能**
- **チャプター・要約生成の処理進捗状況をメールで通知する機能**
- **管理画面でのデータベース管理機能**
Django標準の管理画面を使用してデータの追加・更新・削除ができます。



### ★画面遷移図★
【講師の画面】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852685/9e6db6b2-19bc-0685-266e-5537b0f92937.png)

【生徒の画面】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852685/30ed82db-9715-94b4-f868-99140003263d.png)

詳しくは実際のサイトを触って確認いただけると嬉しいです。
<!--
(https://video-learn.site)
-->

# ER図
![ER図-vile.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852685/60fb2204-35a2-b345-160d-56e701879533.jpeg)

ユーザーが講師か生徒かによってサイトの表示内容を変化させたかったので、DjangoのカスタムUserに含まれるis_staffカラムを使いました。講師の場合はis_staffカラムをTrueにしました。
(UsersカラムはDjangoのカスタムユーザーを継承しているため本来はもっと沢山カラムがありますが、ここではアプリで使用するカラムのみ記載しています。)

# チャプター・要約生成処理
以下の図はチャプター・要約生成処理の流れです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852685/f06510c6-ba79-6183-96e1-b608662ffd79.png)


ハッカソンでのチャプター生成処理をもとに作っていますが、大きく変えた部分が2点あります。(ハッカソンでのチャプター生成処理は[こちら](https://qiita.com/to-u-ko/items/e3c2d2f46ec8ea541c36#%E3%83%81%E3%83%A3%E3%83%97%E3%82%BF%E3%83%BC%E7%94%9F%E6%88%90%E5%87%A6%E7%90%86))

### ■chatGPT APIのモデルにgpt-4Turboを使用
2023年11月にChatGPT Plus加入者向けにgpt-4TurboのAPIが利用できるようになりました。
上限が128000トークンまで引き上げられましたが、それでも3~6万字のテキストを一度のリクエストで処理することはできませんでした。そのため引き続きlangchainのテキスト分割機能を使用しています。

### ■AWS Sagemker Processingを使った文字起こし処理
faster-whisperを使った文字起こし処理はCPUだと時間がかかりすぎるため、ハッカソンではAPサーバにGPU搭載のEC2を使用していました。しかしこれだと常時起動するにはコストがかかりすぎます。GPUが必要になるのは文字起こしの処理だけなので、その部分だけGPUを利用できればよいわけです。

特定の処理だけGPUを利用でき、利用した分だけ費用がかかるようなサービスがないかと調べた結果、AWS Sagemaker Processingに辿り着きました。
Amazon SagemakerはAWSが提供するフルマネージド型の機械学習サービスです。機械学習に特化した様々なサービスやツールが含まれており、その中の1つにSagemaker Processingがあります。

Sagemaker Processingは機械学習に使うデータの前処理や後処理を行うためのコンテナ実行環境であり、必要な時に呼び出して指定したスクリプトを実行することができ、処理が終われば自動で停止するため費用は処理にかかった時間分だけですみます。
APサーバには低価格のCPUのEC2を使用し、faster-whisperによる文字起こし処理のみSagemaker Processingを呼び出して実行するようにしました。



# インフラ構成図
![インフラ構成図-Page-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852685/3f3b541e-cfe0-d524-66c8-7244baa4cf5b.jpeg)

- パブリックサブネットが2つありますが、1つはALB設置のために用意したダミーのサブネットです。
- データベースはRDS(MySQL)を使用
- お名前.comでドメインを取得しRoute53に登録
- ACMでSSL証明書を取得しhttps化
- 文字起こし処理にSagemakerを利用(S3のようにVPCEndpoint経由で接続できるようにしたいですが現状できていません)

# 今後の課題
- **チャプターと要約の精度**
faster-whipserによる文字起こしはかなり高精度ですが、chatGPTによるチャプターと要約の生成はまだまだ改善の余地があります。
現状テキストを特定の文字数で分割し、その分割したセグメントごとにチャプターや要約の生成をしています。しかし、分割点がちょうど内容の区切れ目とは限らないためその分割点の前後でどうしても精度は落ちてしまいます。

- **例外処理**
例外処理を実装できていないので対応したいです。

- **レスポンシブ対応**
レスポンシブ未対応のため対応できるようにしたいです。

- **VPCエンドポイント経由でのSagemaker呼び出し**
現状EC2からNatGateway→インターネット経由でSagemaker Processingを呼び出しています。VPCエンドポイント経由で呼び出すようにしたいです。