Pythonを用いたAzure APIによる音声認識の方法

Pythonを用いたAzure APIによる音声認識の方法

Azure「Speech To Text」 の使い方

音声認識技術によって音声ファイルをテキスト化したいという声がある。


音声認識技術によって
音声ファイルをテキスト化したい

以前、5種類の音声認識APIを比較した。
その結果、日本語の音声認識精度が最も高かったのはMicrosoft Azureの「Speech To Text」。

そこで、Microsoft Azure「Speech To Text」APIの使い方を記す。

1. Azureアカウントの作成

必要なもの

  • Microsoftアカウント
  • 電話番号
  • クレジットカード

1.1. Microsoftアカウントの作成

Microsoftアカウントがなければ作る。
https://account.microsoft.com/account?lang=ja-jp

1.2. Azuretアカウントの作成

「無料で始める」を押すと無料で始められる。
https://azure.microsoft.com/ja-jp/free/



いろいろと情報を聞かれるので答えるとAzureアカウントができる。

2. 音声認識APIのインスタンス作成

「AzurePortal」のホームから「Cognitive Services」をクリック。



続いて「音声サービス」の「作成」。



リソースというものが必要らしいので「新規作成」。
適当な名前を付ける。



インスタンスの「名前」、「価格レベル」も決定。



他は変更せずに「作成」。

「Azure Portal」のホームに戻ると「インスタンス」と「リソース」ができている。



3. APIキーなど取得

作成したインスタンス「instance-2022-0324」をクリックすると情報が確認できる。



  • 「キー1」(キー2でもいい)
  • 「場所/地域」

の2つを控えておく。
あとで必要になる

4. プログラム環境構築

Anacondaが既にインストールされている前提。
入ってなければ以下を参考にして入れる。

まず環境「sound」を作る。

1
conda create -n sound python=3.9 -y

azureAPIを使うためのライブラリを入れる。

1
pip install azure-cognitiveservices-speech

終わり。

5. プログラム作成

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

  • KEY = “Azureから取得できるAPIキー”
  • REGION = “インスタンスのリージョン”
  • read_wav_filename = “〇〇.wav”
  • save_csv_filename = “〇〇.csv”
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
import azure.cognitiveservices.speech as speechsdk
import time
import json

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

#### 言語
LANGAGE = "ja-JP"

#### 読み込み・保存するファイル名
read_wav_filename = "seikin.wav"
save_csv_filename = "seikin.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.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

音声の開始時間、終了時間が分かるようにした。

6. プログラム実行結果

手元にあったセイキンの結婚発表動画の音声を使用。
https://www.youtube.com/watch?v=iMjXoAVipaM

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

最初の謎の文章「任席は席tvを陶冶皆さん」は、
動画の最初に流れる歌「Seikin Music Huh SeikinTV Oh Year!」

これは人間が聞いても文字起こしできないので認識できずとも仕方がない。
最初と最後の歌を除くと良い感じに認識できていることが分かる。

下記はYoutubeの機能による自動字幕との比較。
一部の抜粋であるがAzureの方がはるかに優れていることが分かる。

Azure音声認識Youtube自動字幕
ええ、今日の動画は僕からのご報告です。here共同 僕から合法僕です
えー、私ごとではあるんですが、私事ではあるんですが
この度、私、セイキン結婚を致しました。この度私生菌結婚を致しました
ええ、まずね彼女いたのかよっていうね。aまずね 彼女いたのかよっ

次回はAzure「Speech To Text」のモデルカスタマイズによる精度の向上を行う。

7. Azure音声認識リンク

Your browser is out-of-date!

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

×