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をファイル出力する。  ↓  終了 *いずれかのタイミングでサーバからエラーが帰ってきた場合、  成功するまで一連の処理を繰り返す。