はじめに
AWSの自動音声認識サービスAmazon Transcribeが日本語に対応したとのことで、日本語音声を入力して文字起こしを試してみました。
題材
以下のニュース動画を利用しました。
1人のアナウンサーが1分間ほどニュースを読み上げる内容となっていて、複数人による会話などはありません。
文字起こし方法
Transcribeは、
- マネジメントコンソール
- AWS CLI
- AWS SDK for Python (Boto)
にて利用できますが、今回はAWS CLIを使ってみます。
1. 変換をリクエストする
あらかじめ以下のJSONを用意しておいた上で、aws transcribe start-transcription-job
を実行します。
{
"TranscriptionJobName": "yl",
"LanguageCode": "ja-JP",
"MediaFormat": "mp3",
"Media": {
"MediaFileUri": "https://foobar.s3-ap-northeast-1.amazonaws.com/yl.mp3"
}
}
$ aws transcribe start-transcription-job --cli-input-json file://request.json
リクエストが受け付けられると、以下のようなレスポンスが返ってきます。
{
"TranscriptionJob": {
"TranscriptionJobName": "yl",
"TranscriptionJobStatus": "IN_PROGRESS",
"LanguageCode": "ja-JP",
"MediaSampleRateHertz": 48000,
"MediaFormat": "mp3",
"Media": {
"MediaFileUri": "https://foobar.s3-ap-northeast-1.amazonaws.com/yl.mp3"
},
"CreationTime": 1574510851.993
}
}
2. 変換ジョブのステータスを確認する
サブコマンドlist-transcription-jobs
で変換ジョブのステータスを確認します。
$ aws transcribe list-transcription-jobs --job-name-contains "yl"
もし変換が完了していればステータスはCOMPLETED
で返ってきます。
{
"TranscriptionJobSummaries": [
{
"TranscriptionJobName": "yl",
"CreationTime": 1574510995.946,
"CompletionTime": 1574511071.683,
"LanguageCode": "ja-JP",
"TranscriptionJobStatus": "COMPLETED",
"OutputLocationType": "SERVICE_BUCKET"
}
]
}
なお、今回の1分間の音声の変換ジョブの完了には、約1分15秒の処理時間がかかっていました。
3. 変換結果を取得する
サブコマンドget-transcription-job
で変換結果ファイルのURIを取得します。
$ aws transcribe get-transcription-job --transcription-job-name "yl"
{
"TranscriptionJob": {
"TranscriptionJobName": "yl",
"TranscriptionJobStatus": "COMPLETED",
"LanguageCode": "ja-JP",
"MediaSampleRateHertz": 44100,
"MediaFormat": "mp3",
"Media": {
"MediaFileUri": "https://foobar.s3-ap-northeast-1.amazonaws.com/yl.mp3"
},
"Transcript": {
"TranscriptFileUri": "https://s3.ap-northeast-1.amazonaws.com/aws-transcribe-ap-northeast-1-prod/(略)/asrOutput.json?X-Amz-Security-Token=xxxxxxxx&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20191123T122051Z&X-Amz-SignedHeaders=host&X-Amz-Expires=900&X-Amz-Credential=xxxxxxxx&X-Amz-Signature=xxxxxxxx"
},
"CreationTime": 1574510995.946,
"CompletionTime": 1574511071.683,
"Settings": {
"ChannelIdentification": false
}
}
}
TranscriptFileUri
が変換結果ファイルのURIなので、ここからファイルを取得します。
取得したファイルは以下のようになっていました(一部を抜粋)。
結果はtranscripts
とitems
に分かれています。
{
"jobName": "yl",
"accountId": "xxxxxxxxxxxx",
"results": {
"transcripts": [
{
"transcript": "検索 サービス ヤフー ジャパン の (略) 発表 し 、 ます"
}
],
"items": [
{
"start_time": "0.04",
"end_time": "0.54",
"alternatives": [
{
"confidence": "1.0",
"content": "検索"
}
],
"type": "pronunciation"
},
{
"start_time": "0.54",
"end_time": "1.18",
"alternatives": [
{
"confidence": "1.0",
"content": "サービス"
}
],
"type": "pronunciation"
},
{
"start_time": "1.25",
"end_time": "1.73",
"alternatives": [
{
"confidence": "0.5202",
"content": "ヤフー"
}
],
"type": "pronunciation"
},
{
"start_time": "1.73",
"end_time": "2.1",
"alternatives": [
{
"confidence": "0.5202",
"content": "ジャパン"
}
],
"type": "pronunciation"
},
{
"start_time": "2.1",
"end_time": "2.23",
"alternatives": [
{
"confidence": "1.0",
"content": "の"
}
],
},
// 略
{
"start_time": "59.13",
"end_time": "59.48",
"alternatives": [
{
"confidence": "1.0",
"content": "発表"
}
],
"type": "pronunciation"
},
{
"start_time": "59.48",
"end_time": "59.63",
"alternatives": [
{
"confidence": "1.0",
"content": "し"
}
],
"type": "pronunciation"
},
{
"start_time": "59.63",
"end_time": "60.05",
"alternatives": [
{
"confidence": "1.0",
"content": "ます"
}
],
"type": "pronunciation"
}
]
},
"status": "COMPLETED"
}
文字起こし結果
前述のJSONのtranscript
の値が文字起こし結果全体となります。
検索 サービス ヤフー ジャパン の 親会社 セット ホールディングス と 通信 アプリ 大手 の ライン は 今日 経営 統合 する こと で 合意 し た と 発表 し、 まし た 利用 者 数 億 人 規模 の 巨大 相手 企業 が 誕生 し ます 両社 が 発表 し た。 合意 案 で は 最終 的 に セット ホールディングス の 親会社 の ソフトバンク と ライン の 親会社 の 韓国 ネバー が 磯 パーセント ずつ 出資 する、 新 会社 を 作り ます その 傘下 に ホールディングス を 置い て ヤフー や ライン を 子会社 に し、 ます ライン と ヤフー の 親会社 と なる セット ホールディングス の 代表 に は 今 の セット ホールディングス の 川辺 健太郎 社長 が 代表 取締役 社長 県 娘 を ライン の 入れ ザワ 剛 社長 が 代表 取締役 権 更新 よう と し て 共同 で、 着き ます 両社 は 今日 の 午後 五 時 から 改憲 を 開い て 統合 の 狙い など を 発表 し、 ます
固有名詞や同音異義語などを除くと、目立った誤変換として挙げられるのは以下でしょうか。
- 数億人規模 : 1億人規模 (注:ニュースでは1億人と言っています)
- 巨大相手企業 : 巨大IT企業
- 磯パーセント : 50パーセント
- 代表取締役社長県娘を : 代表取締役社長兼Co-CEO
- 代表取締役兼更新よう : 代表取締役兼Co-CEO
Co-CEO(こ・しーいーおー)は難しかったようです。
磯パーセントは、よくわかりません
解説
items
さきほどのtranscript
には、ところどころに半角スペースが見受けられますが、Amazon Transcribeでは
-
全体的な文字起こし結果を
transcript
に -
品詞単位の文字起こし結果を
items
に
返すようになっていて、transcript
には、これら品詞単位の区切りに半角スペースが入っています。
{
"jobName": "yl",
"accountId": "xxxxxxxxxxxx",
"results": {
"transcripts": [
{
"transcript": "検索 サービス ヤフー ジャパン の (略) 発表 し 、 ます"
}
],
"items": [
{
"start_time": "0.04",
"end_time": "0.54",
"alternatives": [
{
"confidence": "1.0",
"content": "検索"
}
],
confidence
また、品詞ごとの変換結果の信頼性がconfidence
に格納されています。
試しにconfidence
が
- 1.0(最高値)であれば**黒**
- 0.9以上1.0未満であれば**濃い灰色**
- 0.9未満であれば**薄い灰色**
で表示するよう、取得したJSONファイルを加工してみました。
import json
def conv_color(confidence: float) -> str:
if confidence == 1:
return "black"
elif confidence >= 0.9:
return "gray"
else:
return "silver"
with open('./transcript.json') as f:
d = json.load(f)
for item in d['results']['items']:
color = conv_color(float(item['alternatives'][0]['confidence']))
print(f'<font color="{color}">', end='')
print(item['alternatives'][0]['content'], end='')
print('</font>', end='')
すると、以下のような結果になりました。薄い部分はAmazon Transcribeも変換結果に自信が無い箇所・・・ということになります。
検索サービスヤフージャパンの親会社セットホールディングスと通信アプリ大手のラインは今日経営統合することで合意したと発表し、ました利用者数億人規模の巨大相手企業が誕生します両社が発表した。合意案では最終的にセットホールディングスの親会社のソフトバンクとラインの親会社の韓国ネバーが磯パーセントずつ出資する、新会社を作りますその傘下にホールディングスを置いてヤフーやラインを子会社にし、ますラインとヤフーの親会社となるセットホールディングスの代表には今のセットホールディングスの川辺健太郎社長が代表取締役社長県娘をラインの入れザワ剛社長が代表取締役権更新ようとして共同で、着きます両社は今日の午後五時から改憲を開いて統合の狙いなどを発表し、ます
費用
1秒の音声変換に、0.0004USDがかかります。ただし、15秒未満の場合は15秒分の料金がかかるとのこと。
今回の音声は約1分なので、おおよそ2〜3円ということになります。
なお、使い始めから1年間は、毎月60分の無料利用枠があります。
最後に
アナウンサーによるはっきりとした音声でも、いくつかの誤変換は発生していました。Amazon Transcribeでは変換結果の信頼度合い(confidence)を品詞ごとに持っているので、これをどう活用するかがポイントなのかもしれません。
また、今回は試せていませんが、音声内の話者数を2人から10人まで指定することが可能で、それら話者ごとの変換ができるようです。テレビ番組や会議の音声を文字起こしさせてみたら面白そうです。