AWS Transcribeを触ってみる

こんにちは。
株式会社クラスアクト インフラストラクチャ事業部の大塚です。

今回はAWSの文字起こしサービスであるTranscribeを触ってみましたので、雑に備忘録します。
TranscribeもTranslateやComprehendと同様、コンソールから分析したい音声を直接入れることで文字起こしすることも出来ますし、音声ファイルを用意してそれを文字起こしさせる方法の2通りがあるようで、それぞれを試してみたいと思います。

# AWS Transcribeとは？

>音声をテキストに自動的に変換してインサイトを得る
Amazon Transcribe は、フルマネージド型の自動音声認識 (ASR) サービスで、デベロッパーが音声の文字起こし機能をプリケーションに簡単に追加できるようにします。数十億パラメーターから構成される、次世代の音声基盤モデルを採用し、ストリーミング音声と録音音声の高精度な文字起こしを実現します。業界を問わず数千ものお客様が、手動タスクの自動化、豊富なインサイトの取得、アクセシビリティの向上、音声および動画コンテンツの発見しやすさの強化に役立てています。

https://aws.amazon.com/jp/transcribe/

# 触ってみる
## Webコンソールで音声を入力して文字起こしさせる
AWSコンソールでTranscribeと検索すると本サービスが出てきますので、押下します。
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/81b04ccb-c380-ef6b-4d2d-c6bb7934f726.png)
以下のような画面が表示されます。画面左のタブのリアルタイムトランスクリプションを押下します。
![Untitled (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/e23d520e-6a50-e56a-8739-c5c786b5316c.png)
言語設定で日本語を選択した後、ストリーミングを開始ボタンを押下し、CNNの日本語訳の最初の方を読んでみると、以下のように私が読んでいた文章が出力されていることがわかります。
![Untitled (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/f1616e15-5cf6-3134-80ff-ecb6778b5fa2.png)
```
今年 の 夏、 反 観光 抗議 運動 が ヨーロッパ 全土 に 広がり、 オランダ・ ギ ギリシャ、 そして もちろん、 スペイン で も デモ が 行わ れ て いる 月 初旬、 抗議 活動 活動 から は スペイン の バルセロナ 市 の 人気 観光 地 を 更新 し、 何 も 知ら ない 観光 客 に に 水 鉄砲 を 浴びせ ながら、 観光 客 は 帰れ と 叫ん だ。 そして 最近 で は スペイン の マヨルカ 島 で 数千 人 が 抗議 活動 を 行い、 取材 者 は 同党 の 観光 モ モデル は、 労働 者 を 貧困 に 陥る。 
ほんの 一握り の 人 しか 裕福 に なら ない と 主張 し た。 
```

読んだニュース記事は以下の記事の最初の方です。

https://edition.cnn.com/2024/07/27/travel/why-europe-has-become-an-epicenter-for-anti-tourism-protests-this-summer/index.html

完全なトランスクリプションをダウンロードするボタンを押下するとJSONファイルがダウンロードされます。
![Untitled (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/02b75b5d-5dbb-c0d2-65bf-165f06515aab.png)
これの中身を見てみると以下のようなデータが格納されています。
全文は20万行近くあるので、こちらに記載することはできないが、センテンスである程度区切っているように見えます。
```
	{
		"Transcript": {
			"Results": [
				{
					"Alternatives": [
						{
							"Items": [
								{
									"Content": "今年",
									"EndTime": 3.125,
									"StartTime": 2.855,
									"Type": "pronunciation",
									"VocabularyFilterMatch": false
								},
								{
									"Content": "の",
									"EndTime": 3.245,
									"StartTime": 3.125,
									"Type": "pronunciation",
									"VocabularyFilterMatch": false
								},
								{
									"Content": "夏",
									"EndTime": 3.485,
									"StartTime": 3.245,
									"Type": "pronunciation",
									"VocabularyFilterMatch": false
								},
								{
									"Content": "、",
									"EndTime": 3.485,
									"StartTime": 3.485,
									"Type": "punctuation",
									"VocabularyFilterMatch": false
								},
								{
									"Content": "反",
									"EndTime": 4.045,
									"StartTime": 3.805,
									"Type": "pronunciation",
									"VocabularyFilterMatch": false
								},
								{
									"Content": "観光",
									"EndTime": 4.485,
									"StartTime": 4.045,
									"Type": "pronunciation",
									"VocabularyFilterMatch": false
								},
								{
									"Content": "抗議",
									"EndTime": 5.125,
									"StartTime": 4.485,
									"Type": "pronunciation",
									"VocabularyFilterMatch": false
								},
								{
									"Content": "運動",
									"EndTime": 5.275,
									"StartTime": 5.125,
									"Type": "pronunciation",
									"VocabularyFilterMatch": false
								},
								{
									"Content": "が",
									"EndTime": 5.405,
									"StartTime": 5.275,
									"Type": "pronunciation",
									"VocabularyFilterMatch": false
								}
							],
							"Transcript": "今年の夏、反観光抗議運動が"
						}
					],
					"ChannelId": "ch_0",
					"EndTime": 5.775,
					"IsPartial": true,
					"ResultId": "ca04adfe-654f-44d7-8388-63e52dfbe97b",
					"StartTime": 2.845
				}
			]
		}
	},
```

## 音声ファイルで文字起こしさせる
Translate,Comprehendと同様にS3にデータを格納して、それを使って文字起こしをしてもらいます。
まず音声データを作成する必要があるため、Windowsのデフォルトのアプリであるサウンドレコーダーを使って音声を収録しました。読んでいる記事内容は先ほどと同様です。
![Untitled (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/9cf8a558-a718-acda-6045-b352b5246c16.png)
音声データがm4a拡張子で保存されていることがわかります。
![Untitled (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/5ae0044e-3c53-9e81-ab61-062adbcb1d0b.png)

S3バケットにtranscribeフォルダを切ります。translateの時と同様にinput/outputフォルダも内部で切ります。
inputフォルダに先ほど作成した音声データを格納しておきます。
![Untitled (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/3f99f018-8eda-6cbd-a23f-cd49ef0123a4.png)
![Untitled (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/35e909f8-dbbf-3c5c-61b0-41d765373516.png)
![Untitled (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/543c1456-e062-385e-f2a4-3c1f6b7fdd69.png)

音声データの準備が出来ましたので、ジョブを作成していきたいと思います。
左タブのトランスクリプションジョブを選択して、ジョブを作成ボタンを押下します。
![Untitled (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/5361fcc1-6b15-0f81-8375-1b65ab463dde.png)
以下の設定でジョブを作成しました。
名前をtest-transcribeとしました。音声データは日本語ですので、言語は日本語を選択します。
入力データはS3に格納している音声データを選択。出力データは先ほど作成したS3バケットのoutputフォルダを選択します。
後はデフォルトの設定で作成しました。
![screencapture-ap-northeast-1-console-aws-amazon-transcribe-home-2024-07-28-14_53_38 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/3fa9c07c-2c84-0950-95cd-d3eedaebfe6c.png)
![screencapture-ap-northeast-1-console-aws-amazon-transcribe-home-2024-07-28-14_54_01 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/3e7b0376-b837-d6e1-2577-22ac9a13da80.png)
作成すると以下のような画面が表示されます。ステータスが完了になることを確認しましょう。
私の環境だけかもしれませんが一瞬で終わりました。translateが時間かかった割に。。。
![Untitled (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/3387352b-a041-a8c4-554c-7703f530f0f3.png)
![Untitled (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/6112550f-7d0e-5aa5-303f-7b0e0ce86de8.png)
![Untitled (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/635be2fc-772b-c0b9-124b-04b61c2bdb35.png)
S3バケットのoutputディレクトリを確認すると、ファイルが格納されていることが確認できます。
![Untitled (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/29c9f60b-cffd-8574-f8ff-5de91bc89831.png)
上記ファイルをローカルにダウンロードして開いてみるとJSONデータがあることがわかります。
![Untitled (14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/9ab515a6-143e-5d0b-fae4-d59f1e9e2396.png)
これのresultsオブジェクトのtranscriptsフィールドにあります。
若干文章が怪しいですが、たぶん私の活舌の問題でしょう（白目）
このまま使うのではなく、この後に文章が通るように成形するような処理をかませた方がよさそうですね。
```
"transcript": "今年の夏、反観光抗議運動がヨーロッパ全土に広がり、オランダ、ギリシャ、そしてもちろんスペインでもデモが行われている。七月初旬、講義講義活動からはスペインのバルセロナ市の人気観光を更新し、何も知らない観光客に水鉄砲を浴びせながら観光客は帰れ！と叫んだ。そして最近ではスペインのマヨルカ島で数千人が抗議活動を行い、主催者は道々の観光モデルは労働者を貧困に陥れ、ほんの一握りの人しか裕福にならないと主張した。"
```