プログラム解説.txt 2.03 KB
Newer Older
藤森雅人's avatar
藤森雅人 committed
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
2019年7月26日 藤森雅人

概要

 これは吉田さんからオーダーを受け、基本的に藤森が作成したものです。
 自社開発のラジオ放送局向けDAWに組み込む音声文字起こし機能を実現すべく開発されました。

仕様

 入力:.wav形式の音声ファイルのパスを示すstring型文字列のvectorです。
 出力:.txt形式のテキストファイルです。

 プログラムは、与えたそれぞれの音声の処理をマルチスレッドで行います。
 目安として約 5 分の音声を 12 個与えた場合、約 4〜5 分ほどで全ての処理が完了します。
 テスト環境は次の通りです。

 Windows 10 Pro
 CPU 2.7 GHz Intel Core i5 4 コア
 メモリ 8 GB


技術的詳細

 Speech-to-Text:IBM Watsonで提供されている、音声の文字起こしを行うクラウド機械学習サービス。
 C++ REST SDK:Microsoftのオープンソースソフトウェアで、REST通信一般を扱うC++ライブラリ。
 opus:高い圧縮率で知られるコーデック形式。ファイルフォーマットはogg。

 プログラムを動かすサンドボックスとしてMFCアプリケーションを使用しています。

技術的制約

 curlコマンドでAPIを叩けばアップロードできる大容量wavファイルが、C++ REST SDK経由では503 Internal Server Errorが返ってくる。容量だけでなく再生時間にも上限があるとみられる。ある程度容量が小さければ、サーバがデータを拒否することはない。そこで、プログラムでは再生時間の長い音声を予め短く分割した複数のwavファイルの入力を想定した。

動作の流れ

 .wavファイルのパスの一覧を入力とする。
 ↓
=run_exec_parallel()=
 要素ごとにパスを取り出して、処理を実行するスレッドを作成する。
 ↓
=スレッドごと=
=try_exec_api()=
 .wavファイルを.opusファイルにconvert()で変換して出力する。
 exec_speech2text_api()を呼び出し、以降の処理が成功するまでループする。
 ↓
=exec_speech2text_api()=
 ファイルストリームの準備
 HTTPクライアントの準備
 ↓
=APIを叩く=
*音声をアップロードする。
 なおレスポンスは全てJSONである。
 ↓
 サーバが音声を受理するとジョブを作成する。
*ジョブが完了しているかどうかはAPIを叩いて確認する。
 2 秒程度スリープしながらAPIを叩き、未完了ならループする。
 ↓
 ジョブが完了したらループを抜け、JSONをファイル出力する。
 ↓
 終了

*いずれかのタイミングでサーバからエラーが帰ってきた場合、
 成功するまで一連の処理を繰り返す。