Azure音声認識APIの日本語モデルカスタマイズ 1. プレーンテキスト

Azure音声認識APIの日本語モデルカスタマイズ 1. プレーンテキスト

「Custom Speech」によってAzure音声認識APIの日本語モデルの精度を向上

前回行ったAzure音声認識APIの実験の続き。

Azureの音声認識サービス「Speech to Text」にはユーザーのデータからモデルの再学習を行い認識精度を高める機能がある。

「Custom Speech」と呼ばれるその機能は「音声ファイル」、ラベル付きテキスト、音素による発音指定テキストなど様々なデータによるカスタマイズが可能。

扱う言語によって機能に制限がある、日本語について確認。



あまりにマイナーな言語過ぎて「プレーンテキスト」によるカスタマイズ以外はできないようだ。
したがって「プレーンテキスト」を利用したazureの音声認識カスタマイズを行う。

1. 「Custom Speech」によるモデルカスタマイズ

モデルのカスタマイズは「SpeechStudio」で行う。

1.1. プロジェクトの作成

「SpeechStudio」のトップページからプロジェクトを作成する。



「Custom Speech」の「プロジェクトの開始」をクリック。



リソースはあらかじめ作ってあるものを選択。
「リソースの使用」。



「新しいプロジェクトの作成」。



適当な名前を付けて「作成」。

1.2. 学習データのアップロード

トレーニングに使用する学習データをアップロードする。



さきほど作成したプロジェクトをクリック。



「音声データセット」から「データのアップロード」。



「テキスト」を選択して「次へ」。
音声も学習できそうなことが書いてあるので次回試してみる。



テキストファイルをアップロード。
日本語のサンプル文章を1行につき1文、20,000行まで書いていい。
utf-8じゃないと駄目らしい。



適当な名前を付けて「次へ」。



「保存して閉じる」。

1.3. トレーニング

アップロードした学習データでトレーニングを行う。



「カスタムモデルのトレーニング」から「新しいモデルのトレーニング」。



変更せず「次へ」。



さきほどアップロードしたデータを選択して「次へ」。



適当な名前を付けて「次へ」。



「保存して閉じる」。
すると数分で学習が終わる。

1.4. モデルデプロイ

学習したモデルを使えるようにする。



「モデルのデプロイ」から「モデルのデプロイ」。



適当な名前を付けて、
先ほど作ったモデルを選択して「追加」。



デプロイされる。

1.5. エンドポイントID取得

モデルにアクセスするためのエンドポイントIDを取得する。



デプロイしたモデルをクリック。



エンドポイントIDを控えておく。

2. 実験

当然セイキンの結婚発表動画の音声を使用。
https://www.youtube.com/watch?v=iMjXoAVipaM

学習に使用したデータは以下の2行のテキストファイル。

1
2
SeikinTVは世界で最も有名なチャンネルのうちの一つです。
SeikinTVのSeikinは多くのことを私たちに教えてくれます。

通常のモデルとカスタマイズモデルの結果を比較。

2.1. プログラム作成

音声認識用のwavファイルを準備。
上の方の4つの変数を変えると動く。

  • KEY = “Azureから取得できるAPIキー”
  • REGION = “インスタンスのリージョン”
  • read_wav_filename = “〇〇.wav”
  • save_csv_filename = “〇〇.csv”
  • END_POINT_ID = “Azureから取得できるエンドポイントID”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import azure.cognitiveservices.speech as speechsdk
import time
import json

#### Azure から取得できるAPIキー、インスタンスのリージョン、言語、
KEY = "Azureから取得できるAPIキー"
REGION = "インスタンスのリージョン"

#### 言語、エンドポイントID(カスタムモデルの場合)
LANGAGE = "ja-JP"
END_POINT_ID = "Azureから取得できるエンドポイントID"

#### 読み込み・保存するファイル名
read_wav_filename = "seikin.wav"
save_csv_filename = "seikin_custom.csv"

# speech_recognizerによる認識が終了したらTrueになる
RECOGNIZED_ALL = False

#### speech_recognizer のイベント(session_stopped, canceled)発生時に実行
def stop_recognizer(evt, speech_recognizer):
print("closing on {}".format(evt))
speech_recognizer.stop_continuous_recognition()
global RECOGNIZED_ALL
RECOGNIZED_ALL = True

#### speech_recognizerのイベント(recognized)発生時に実行、結果をファイルに保存
def add_file(evt, save_csv_filename):
stt = json.loads(evt.result.json)
start_time = round(stt["Offset"] / 10000000, 2) # 10000000で割ると単位が(秒)になる
end_time = round(start_time + stt["Duration"] / 10000000, 2)
new_row = str(start_time) + "," + str(end_time) + "," + stt["DisplayText"] + "\n"
print(new_row)
with open(save_csv_filename, mode='a', encoding="utf-8") as f:
f.write(new_row)

#### 音声認識を行う
def wav_speech_recognize(read_wav_filename, save_csv_filename):
#### speech_recognizer初期設定
speech_config = speechsdk.SpeechConfig(
subscription=KEY, region=REGION, speech_recognition_language=LANGAGE)
speech_config.endpoint_id = END_POINT_ID
speech_config.request_word_level_timestamps() #### timestamp https://stackoverflow.com/questions/56842391/how-to-get-word-level-timestamps-using-azure-speech-to-text-and-the-python-sdk
audio_config = speechsdk.audio.AudioConfig(filename=read_wav_filename)
speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config, audio_config=audio_config)

#### speech_recognizerの各イベント発生時に行う動作を設定する
speech_recognizer.recognized.connect(lambda evt: add_file(evt, save_csv_filename))
speech_recognizer.session_started.connect(lambda evt: print('SESSION STARTED: {}\n'.format(evt)))
speech_recognizer.session_stopped.connect(lambda evt: print('SESSION STOPPED {}\n'.format(evt)))
speech_recognizer.canceled.connect(lambda evt: print('CANCELED {}\n'.format(evt)))
speech_recognizer.session_stopped.connect(lambda evt: stop_recognizer(evt, speech_recognizer))
speech_recognizer.canceled.connect(lambda evt: stop_recognizer(evt, speech_recognizer))

#### 認識開始(=speech_recognizer実行)
speech_recognizer.start_continuous_recognition()
# While Loopしている間に非同期で実行され、上記のイベントが発生
# 認識が終了するとstop_recognizerによってRECOGNIZED_ALL=Trueになりループを抜ける
while not RECOGNIZED_ALL:
time.sleep(.5)

#### MAIN
if __name__ == '__main__':
wav_speech_recognize(read_wav_filename, save_csv_filename)

Microsoftの公式ドキュメントを参照して改造。
https://docs.microsoft.com/en-us/azure/cognitive-services/speech-service/get-started-speech-to-text?tabs=windowsinstall%2Cterminal&pivots=programming-language-python

2.2. プログラム実行結果

プログラムの実行結果を確認。
同じ音声ファイルに対する通常モデルの結果とカスタムモデルの結果を比較。

通常モデルカスタムモデル
責任席は席tvを陶冶皆さん、メリークリスマスセイキンtvの最近です。クリスマスどうお過ごしですか?景気食べてますか?デートですか?それとも部活勉強、お仕事ですか?ええ、今日の動画は僕からのご報告です。えー、私ごとではあるんですが、この度、私、セイキン結婚を致しました。ええ、まずね彼女いたのかよっていうね。石油席は席tvを陶冶皆さん、メリークリスマスseikin tvのseikinです。クリスマスどうお過ごしですか?景気食べてますか?デートですか?それとも部活勉強お仕事ですか?ええ、今日の動画は僕からのご報告です。えー、私ごとではあるん?ですが、この度、私seikin結婚を致しました。ええ、まずね彼女いたのかよっていうね。
ええ話なんですけれど、まあ、僕ももう27歳ということでええ、いい歳です。まあ、むしろ至ってね、普通かなと思っています。えー、実は以前よりですねええ。まあ2年半ぐらい前からええ、彼女と付き合いをしておりましてええ、この度入籍をいたしました。えー、実はですね。ええ、彼女がというか、まあ奥さんになるんですが、今までセイキンtvのカメラを取ってくれていました。えー、今まではですね、専属カメラマンもしくはスタッフなどという言い方をしてたんですけれど、実はそれが奥さんです。ええ話なんですけれど、まあ、僕ももう27歳ということでええ、いい年です。まあ、むしろ至ってね、普通かなと思っています。えー、実は以前よりですねえ。まあ2年半ぐらい前からええ、彼女と付き合いをしておりまして。ええ、この度入籍をいたしました。えー、実はですねえ。彼女がというか、まあ奥さんになるんですが、今までseikin tvのカメラを取ってくれていました。えー、今まではですね、専属カメラマンもしくはスタッフなどという言い方をしてたんですけれど、実はそれが奥さんです。
えー。まあ、今までなぜ彼女のことをやけにしなかったかというとですね。まああんまり簡単にねこう彼女、彼女とええ動画で言うと、ええ、皆さんの混乱を招くかなと思ったということと、あとは僕自身がえ、中途半端な状態で言いたくなかったと言うことが理由です。えい皆さんにお伝えするのはええ必ず結婚してからと初めから決めていました。えー、以前からですね。動画やツイッターなどで彼女いないんですか?さみしくないんですか?結構ね質問頂いてたんですけれど、まあ、一切触れていきませんでした。えー。まあ、今までなぜ彼女のことをやけに私なかったかというとですね。まああんまり簡単にね。こう彼女、彼女とええ動画で言うと、ええ、皆さんの混乱を招くかなと思ったということと、あとは僕自身がえ、中途半端な状態で言いたくなかったと言うことが理由です。ええ、皆さんにお伝えするのはええ必ず結婚してからと一から決めてました。えー、以前からですね。動画やツイッターなどで彼女いないんですかさみしくないんですか?結構ね質問頂いてたんですけれど、まあ一切触れていきませんでした。
まあ、あえて触れてこなかったのは先ほど言った理由からです。ええちなみにですね、外での撮影もしくはスタジオでの撮影などはですね。僕の専属の男性マネージャーに協力をしていただいて、え?撮影などしていました。わかりやすくて家で取ってるやつ。まあほとんど家でとってるんですけれど、普段の動画奥さんがとってくれます。まあね、僕はyoutubeクリエイターというええクリエイティヴな仕事をしていますので、日日ね撮影編集っていうのをずっと一人でやってるとまあ煮詰まってくるんですよほかのね、クリエイターさんもそうかもしれません。まあ、あえて触れてこなかったのは先ほどいった理由からです。ええちなみにですね、外での撮影もしくはスタジオでの撮影などはですね。僕の専属の男性マネージャーに協力をしていただいて、え?撮影などしていました。わかりやすくて家で取ってるやつ。まあほとんど家でとってるんですけれど、普段の動画奥さんがとってくれます。まあね、僕はyoutubeクリエイターというええクリエイティヴな仕事をしていますので、日日ね撮影編集っていうのをずっと一人でやってると、まあ煮詰まってくるんですよほかのね、クリエイターさんもそうかもしれません。
ええそんな時、いろんな面でサポートしてもらったおかげでええ、こうやって今ええ、毎日皆さんにええ動画をお届けすることができていると思っています。ええ、もちろん今のせいきんtvがあるのはいつも僕の動画を見てくれている皆さんのおかげです。日々感謝をしております。ありがとうございます。ええそんな時、いろんな面でサポートしてもらったおかげでええ、こうやって今ええ、毎日皆さんにええ動画をお届けすることができていると思っています。ええ、もちろん今のseikin tvがあるのはいつも僕の動画を見てくれている皆さんのおかげです。日々感謝しております。ありがとうございます。
あちなみにね、子供はいません。まあのちのちねええ。それで今後のせいきんtvについてですが、特に変わりません。えー、奥さんが出る事もありません。ええ、その理由はですね。セイキンtv非常に多くの方に主張していただいていますということはですね。そこに顔を出すということは非常にリスクも、大きいと言うことも忘れてはいけません。あくまで僕、セイキンの考えなんですけれど、まあ一番大切な人を簡単に動画に出すわけにはいかないと思っています。えー、今回ですね。あちなみにね、子供はいません。まあのちのちねええ。それで今後のseikin tvについてですが、特に変わりません。えー、奥さんが出ることもありません。ええ、その理由はですね。Seikin tv非常に多くの方に主張していただいていますということはですね。そこに顔を出すということは非常にリスクも、大きいと言うことも忘れてはいけません。あくまで僕seikinの考えなんですけれど、まあ一番大切な人を簡単に動画に出すわけにはいかないと思っています。えー、今回ですね。
こうやって公に結婚の報告をさせていただいたので、まあ今後少しね声ぐらいは出るかもしれません。その時はひとつよろしくお願いします。こうやって公に結婚の報告をさせていただいたので、まあ今後少しね声ぐらいは出るかもしれません。その時はひとつよろしくお願いします。
ええあと結婚式なんですけれど、まだしておりません。まあ来年かなと思っています。はいということで、これからも変わらず頑張っていきたいと思います。どうか温かい目で見守っていただけたら幸いです。えあと結婚式なんですけれど、まだしておりません。まあ来年かなと思っています。はいということで、これからも変わらず頑張っていきたいと思います。どうか温かい目で見守っていただけたら幸いです。
あ、ありがとうございます。ええなめ先生もおめでとうとおっしゃっております。はいということでまたお会いしましょう。シーユーネクストタイム。あ、ありがとうございます。ええなめ先生もおめでとうとおっしゃっております。はいということでまたお会いしましょう。シーユーネクストタイム。
口で。口で。
Youtube youtube。明石。
世間tvチャンネル登録してね。Youtube、youtube、夢つ宙。
Seikin tvチャンネル登録してね。

「seikin」、「seikin tv」の認識精度が上がっている。
学習データに含まれた単語がしっかりと学習できている。

3. Azure音声認識リンク

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×