読者です 読者をやめる 読者になる 読者になる

仕事の備忘録

IT系技術とか、カスタマーサービスとか

祝!Microsoft Cognitive Services: Bing Speech API の一般提供開始

Micorsoft Azureからのメールで、ついにMicrosoft Cognitive Services: Bing Speech API の一般提供開始 が始まったことを知った。先月より予告は出ていたが月末近くになっても連絡がこなくて心配していたのであった。

azure.microsoft.com

Bing Speech API は文字起こしをするためにちょうど利用しようとしているところであり、ffmpegで前準備の記事を書いてるところであるが、プレビュー時点でも商用利用が多数行われている人気のAPIである。

音声の認識

testedquality-tech.hatenadiary.jp

 ちょうど先週富士通SSLより発表された「FUJITSU Software LiveTalk」にてもBing Speech APIが利用されている。

www.fujitsu.com

一般提供になったことで一番の違いは「99.9% の可用性が保証」されること。こちらにSLAが記載されているがプレビューでは可用性が保証されていないのだ。

azure.microsoft.com

製品やサービス展開するための安心が付与されたことで、これから国内でも積極的に使われると思われる。

 

ffmpegとC#を使って指定秒数の音声ファイルを作る 2.連続分割処理

ffmpeg Cognitive Services

前回の設計から、CSVファイルを読み込んたので、mp4ファイルを分割する。

testedquality-tech.hatenadiary.jp

 ffmpeg.exeをそのまま利用するため、DOSで呼び出すことが必要。実際にffmpeg.exeを使うと分かるがそれなりの処理時間と出力が伴う。コマンドラインとしては下記のようになる。

例:ffmpeg -ss [開始位置(秒数)] -i [元動画] -t [切り出す秒数] [新しい動画]

ffmpeg -ss 0 -i C:\Uni\SourceMovie\K_111.mp4 -t 120 C:\Uni\DestFile\K_111\output01.mp4

前回読み込んだdataListのデータをそのままループさせて、ffmpegを呼び出しmp4ファイルを指定秒数に切り分ける連続処理を実施する。

-----------------------------------------------------------------------------------------------------------

var dFolderPath; //分割ファイルを置くフォルダ

var sSplitMinFilename; //CSVファイルパス

var dataList = setCSV(sSplitMinFilename); //前回説明したファイル読み出し

               foreach (CSVData c in dataList)
                    {
                        //ffmpegを呼び出しmp4ファイルを指定秒数に切り分ける
                        var dFileName = dFolderPath + "\\" + c.Name + "_" + c.Id.ToString() + ".mp4"; //出力ファイル名
                        var arguments = string.Format("-ss {0} -i {1} -t {2} {3}", c.startsec.ToString(), f, c.vframessec.ToString(), dFileName);

                        var process = Process.Start(new ProcessStartInfo("ffmpeg.exe", arguments)
                        {
                            CreateNoWindow = true,
                            UseShellExecute = false,
                        });
                        process.WaitForExit();
                        //プロセスが終了したか確認する
                        if (process.HasExited)
                        {
                            WriteLine("処理正常終了:01動画切り出し:" + c.Name + ":" + c.Id.ToString()); //ログ画面にエラー出力
                        }
                        else
                        {
                            WriteLine("プロセスが終わってない!ファイル作れなかったかも!強制終了しとくね。" + c.Id.ToString() + ":" + c.Name ); //ログ画面にエラー出力
                            process.Kill(); //強制終了
                        }
                    }

-----------------------------------------------------------------------------------------------------------

実際にファイル分割が完了したら、音声ファイルにさらに変換する。分割と音声変換を連続して命令することも可能であったが、読み込んだCSVファイルの指定自体が間違っていた場合の再処理を考えて、一度mp4分割のみを完了させることにした。

音声に変換する場合には上の//ffmpegを呼び出しmp4ファイルを指定秒数に切り分ける と書いた部分について以下のように変更となる。ここでのポイント「pcm_s16le」は音声の劣化をさせないような変換となる。これはAPIでの文字起こしをする場合を考慮してできる限りよい状態を保持するようにするためである。

例:ffmpeg -i [元動画] -acodec pcm_s16le [取り出す音声]

ffmpeg - i C:\Uni\DestFile\K_111\output01.mp4 -acodec pcm_s16le C:\Uni\DestFile\K_111\output01.wav

-----------------------------------------------------------------------------------------------------------

//ffmpegを呼び出しmp4ファイルを音声ファイルwavに変換する
                        var dFileName = dFolderPath + "\\" + c.Name + "_" + c.Id.ToString() + ".mp4"; //変換ファイル名
                        var dwavFileName = dFolderPath + "\\" + c.Name + "_" + c.Id.ToString() + ".wav"; //出力ファイル名

                        var arguments = string.Format("-i {0} -acodec pcm_s16le {1}", dFileName, dwavFileName);

-----------------------------------------------------------------------------------------------------------

ちなみに、音声ファイル変換時エラーが発生する場合があった。これは単純に音声が記録されてなかったためであった。

ということでこんな感じでファイルが分割され、wavファイルも作成できたので文字起こしの準備が完了した。

同じファイル名で.jpgも作っている。指定秒数の先頭の画像を切り出してみた。

例:ffmpeg -ss [秒数] -i [動画] -vframes [フレーム数] -f image2 [出力ファイル名]

頭出しのサムネイルとして使うつもりだったが、Cognitive Servicesの別APIで使ってみることにした。

ffmpegとC#を使って指定秒数の音声ファイルを作る 1.ざっくり設計

Cognitive Services ffmpeg

前回ffmpegを使ってDOSコマンドで音声変換を行った。その話を会社でしたら、ある動画からの文字起こしを自動的に行いたいという要望がやってきた。

testedquality-tech.hatenadiary.jp

 文字起こしというのは、インタビューなどの会話を録音し、あとから文字として文書化することの総称。結構な手間がかかり専門の業者がたくさんある。そしてこちらでは専用アプリでの音声文字変換による支援サービスを提供中。

voxt.jp

この会社が行っているような、自動化をもっと手軽に自社でできないかという相談だ。これができるようになると、自分の周りで行っている通常の電話応対や、インタビューなども文字起こしして、検索データベース化したり、資料保存の作業低減ができるかもしれない。そんな気持ちから対応することになった。

前回試してみた「Bing Speech API」を使うとなると最大2分までしか一度に翻訳できない。そうなるとバッチコマンドを並べて一括処理でAPI最大処理分数である2分の動画を切り出せはよいと考えたが、実際にバッチで切り出してみたところ、話の途中で切れると、API側で話の前後の内容が正しく理解できず変な文章が戻ってくる。

イメージとしてはYoutubeで自動文字起こしがついているとき。多分あれもgoogleの日本語文字起こしが自動的に行われている。動画の登録時のオプションで設定できるのだが切れ切れの文字起こしはわかりづらい(この場合話し言葉を聞き取れてないのもあるのだが)サンプル動画はこちら。

www.youtube.com

Youtube.comのサイトにて動画を見ると画面左下のメニュー「その他」の中に「文字起こし」というメニューが出てくる。これがgoogleが自動文字起こしをした結果を表示させている。

 

これを見る限り、文として完結している、読点が付いた秒数で音声ファイルを切り出さないといけないことが分かった。単純に2分毎に切断というわけにはいかないのであった。当たり前なのだけど、APIに処理させることばかり考えてた。反省。

まずは後から秒数を指定できるように、秒数をインプットで可変で対応できるようにしてffmpegで指定秒数切り出しを実施することにした。前回バッチプログラムを出力する方針にしていたが、自動的に切り出すプログラムを作るように変更する。

秒数のインプット形式はCSVにすることを決めた。今回仕事の依頼者がサーバ持ってなかったので手軽な方法を選択。CSVをC#で扱う手段は調べたらたくさんあったが、.Net 2.0の方法などが検索上位に出てくる。やりたいことはできるが納得いかず。ググった末に見つけたのは、NuGet取得できてメンテナンスもされてて初心者な自分でも使いやすかったこちら。ありがたしLINQ to CSV。

devlights.hatenablog.com

 ffmpegはDOSでの処理を行っている。DOSをC#から使う方法は検索したところ、ffmpegを使ったサンプルがすでに書かれていたのでありがたく参照。

blog.shibayan.jp

 これでやりたいことはできそうな見通しが立ったのでプログラムを書くことにした。

★インプットのCSV設定

CSVには切り出す秒数の開始時点と、そのあとの秒数を設定。前2つはDB化した場合のキー項目、ファイル名と連番を指定。

「きちんと順番に項目を並べてないのは気持ち悪いぞ!」と自分でも思うがプログラムしながら項目並べたらこんな感じに。LINQ to CSVを使えば項目指定もできるので不便はそこまで感じない。

こんなクラスを準備して、指定CSVを読み出すメソッドを下記のように準備できる。ありがたい。
    class CSVData
    {
        [CsvColumn(FieldIndex = 1)]
        public string Id { get; set; }
        [CsvColumn(FieldIndex = 2)]
        public string Name { get; set; }
        [CsvColumn(FieldIndex = 3)]
        public int startsec { get; set; }
        [CsvColumn(FieldIndex = 4)]
        public int vframessec { get; set; }

    }

   

/// <summary>
/// asa 処理ファイル作成
/// </summary>
/// <returns>List型のCSVデータセット</returns>
/// <param name="csvpath">読み取るCSVファイルパス</param>

    private List<CSVData> setCSV(string csvpath)
        {
            //
            // LINQ to CSVのサンプル.
            //   元ネタ: http://www.codeproject.com/Articles/25133/LINQ-to-CSV-library
            // 
            // LINQ to CSVはNuGetでインストールできる.
            //   Install-Package LINQToCSV
            
            // コンテキストを構築.
            var context = new CsvContext();

            //
            // CSVの情報を示すオブジェクトを構築.
            //
            var description = new CsvFileDescription
            {
                SeparatorChar = ',',
                FirstLineHasColumnNames = false,
                EnforceCsvColumnAttribute = true,
                TextEncoding = Encoding.UTF8
            };

            //
            // 読み取り.
            //
            var dataList = context.Read<CSVData>(csvpath, description).ToList();

           return dataList;

        }

.

解決した:QnA Maker使ってみたの文字化け

Power BI Cognitive Services

QnA Makerについては、以前の投稿では500エラーがでて接続できてなかったのです。

testedquality-tech.hatenadiary.jp

 日本語が500エラーになったQnA Makerをなんとか使いたくて調べていたらこの記事を発見したので試しました。参考にしたのはMicrosoft MVP Power BIの吉田さんの記事。

qiita.com

この中の手順17をもとにAzure BOT Service側のソースを修正したところ無事に日本語が戻るように。やったー!

吉田さんはPowerBIなどの記事でお世話になっています。尊敬してる。これくらいできるようになりたいもんだ。仕事で10年 .NET 2.0を使い続けてきたので本当にモダンなコードを書きたい。今年の目標。

Power BIのWeb画面(Power BIサービス)にExcelデータを自動更新させるようにした

Microsoft Power BI

会社でやったことを忘れないように記載。

金曜日の夕方上司から「Web画面に毎日の問い合わせ件数を表示したいとXXさんが言ってる」と依頼された。期限はできる限り早く。

「Power BIで今日中にさくっとできるよね」という上司からの一言つき。悔しいので上司の挑戦状受けて立ってみた。2時間一本勝負である。

powerbi.microsoft.com

ヒアリングした要件は以下の通り

  1. グラフを余っているMacを使って表示させてスクラム用の大きなモニターに常時表示する。ただし一般公開は禁止。
  2. 問い合わせ件数データはExcelで管理。パートさんが毎日交代で入力する。彼女たちはPower BIは使えない。
  3. 入力は1日1回朝のみ。表示の更新は自動的に行うこと。
  4. 入力データをグラフ化。サンプルはPower BI Desktopで上司が作成済み。

簡単じゃないじゃん。一つづつ確認する。

1.のMac利用でまずつまずく。MacOSはPower BIのデスクトップ版がない。モバイル版だとiOSありますが。Desktop版が使えるなら共有フォルダにExcel配置して、そのまま画面表示すればいいだけ。残念ながらこの方法は使えず、必然的にWebブラウザで閲覧する形式で検討となった。

powerbi.microsoft.com

2.であるが、問い合わせ対応専門のパートさんたちなので手間はかけさせたくない。Excelに入力するだけにしたい。でもexcelの置き場が問題。社内ファイルサーバとPower BIのWebサイト接続(Power BIサービスと呼ばれる)には「Power BI Gateway」サーバが必要である。別でサーバを立てることは、XXさんが管理できないので無理。

Power BI Gateway | Microsoft Power BI

3.の通り1日1回でいいから自動更新できる機能が必要なので、改めてドキュメントでデータ更新の設定できる方法を確認。まさにやりたいことのタイトルを発見。なるほどPower BI サービス上で作成の上、OneDriveにExcelを配置して参照すればいいのか。更新はブラウザ上のExcel Onlineで行う。これならパートさん達できる。

OneDrive または SharePoint Online の Excel ブックから作成されたデータセットを更新する | Microsoft Power BI

OneDriveのアカウントはPower BIと別のアカウントでもOK。これより会社支給のMSDNアカウントで作成したOneDriveがあるのでそれを使うことにした。 ExcelファイルはOneDriveにおいて共有すればみんなで書き込み可能。上司に念のため説明したところ「この形なら一般公開はしないからOK」と許可を取りました。

4.Desktop版を見るにしても、Web画面をみるためにもPower BIのアカウントが必要。部署でIISログ集計ように作っている共有アカウントをWeb画面表示に利用することにした。どちらもダッシュボード画面でみんなに共有可能。3.のOneDriveアカウントとは別となる。

ここまでの設計で1時間。

f:id:testedquality:20170128012355p:plain

ここからはサンプルのPowr BI Desktop版をPower BI サービス版で作成しなおしを実施。Excelのデータ部分をテーブル形式に書き換えOneDriveに配置した。OneDriveに置くExcelファイルはDesktop版と異なり、利用データ部分がテーブル形式でないと参照ができないので注意。Online上では変換ができなかったのでローカルで作業すること。

こうして、作り直したPower BIサービスでのレポートは、更新は自動的に1時間に設定された。

このやり方だと、OneDriveもPower BIも無料の範囲で可能。無料同士の組織アカウントをつくれば組織内での特定メンバーだけでサイト共有も可能である。

目標通り2時間で帰れたが、思うにこれはMicrosoftの懐の広さによるところが大きい。レドモンドがわからないので品川方面に頭を下げつつ帰宅。

ちなみに上記2.でのPower BI GatewayであるがPersonal版もある。これはPower BI Pro版のみでの提供。今回は無料範囲内での対応だったので対象外とした。

Power BI Gateway - Personal | Microsoft Power BI

ffmpeg 動画加工をコマンドラインで行うよ

動画 ffmpeg

昨年から音声をどれだけ省力で文字にできるかを調べている。サポートなどで電話を受けることがあるのですが、実際にレポート作ったりするとき文字にするのが面倒だなと思ったのがきっかけ。

今回利用予定は「Bing Speech API」

https://azure.microsoft.com/ja-jp/services/cognitive-services/speech/

これを利用して音声を文字起こしを、と考えたものの手元に音声ファイルはない。でも自分の声は聴きたくない。ということで、動画の音声部分を文字に変換することにする。

手順を考えるとサービスに投げる前に元ネタの音声ファイルを作らないといけない。ということで今回は準備編。動画から音声ファイル作成を行うことにする。

まずAmazonや窓の杜でソフトウェアを探していたが、有料の動画編集ソフトしか見つからない。今回変更したいだけなので、数千円のを買うのもどうかと悩んで、ソースコードとか変換ライブラリとかないものかと検索していたところオープンソースの「ffmpeg」を発見。

github.com

マルチメディアファイルを操作できるオープンソース。Toolsにあるコマンドラインで変換できるexeを使って変換が簡単にできるらいしい。

早速なのでWindows版をダウンロードして利用することにした。自分の使いたい環境のものをダウンロード。 https://ffmpeg.zeranoe.com/builds/

ffmpegの使い方 

使い方の一覧はこちらが一番見やすかった。

ffmpegの使い方:tech.ckme.co.jp

あとこちらの記事は利用方法の具体的なイメージが付きやすい。字幕とか。

qiita.com

2つのサイトみただけでわかる、こんなことがコマンドラインから操作できるのか!と感動する機能のラインナップ。

使い方は簡単。ダウンロードしたzipを展開すると、bin直下にexeが3つある。このffmpeg.exeをコマンドラインから利用する(コマンドプロンプトを管理者で実行)

私の場合動画から音声変換なので

ffmpeg -i K_111.mp4 K_111.wav

でWAVファイルに変換となる。

このよしなにこなしてくれる感じ。ffmpeg有能!

改めて「Bing Speech API」の仕様を確認するとShortとLongの2パターンがあり、Shortで最大15秒。Longで最大120秒まで処理可能。

2分より長い音声を処理したい場合、音声ファイルの分割が必要となる。どうせ答えあわせで動画をみるので、まずは動画を120秒に分割→音声に変換の手順とする。

ffmpeg -i K_111.mp4 -ss 30 -t 120 output.mp4 

これで先頭から30秒目より120秒を切り取ってoutput.mp4ファイルを作成する。簡単。コマンドラインでループさせればどれだけ長くても大丈夫。数時間前にソフトをAmazonで物色していた自分はもう忘れた。

これで下準備ができたので、改めて「Bing Speech API」を使う。

2016年12月 Cognitive Services 新サービスQnA誕生

Cognitive Services

 こんにちは。今週MicrosoftよりCognitive Servicesのニュースメールが届きました。こちらの内容を記録しときます。このメール内容がそのまま載っているようなブログがあるならそちら参照できるんですが、メールだと思い出せないとき検索サイトで一気に探せないのが面倒なんで。記憶容量がもう劣化しだしてるんで外部記憶はぜひ活用しときたいんですよね。

ということで新機能や更新された機能の一覧タイトル抜き出しました。

  1. New, QnA Maker available in public preview
  2. Content Moderator in public preview
  3. Microsoft Translator live feature launches
  4. Bing Speech new authentication endpoint

特に気になったのは1番目のQnA Maker。FAQなどのページから質問への事例というか回答例を作り出すサービスです。公式ページはこちら。

QnA Maker

すでにFAQページがあればそれをもとにbotやApplicationなどからの問い合わせ対応ができるように答える仕組みが構築できる。FAQページがなくても画面にて編集登録が可能。

編集画面もあります。URLでFAQ画面を指定したり、tsv形式でデータ取り込みも可能。20MBまでOK。とりあえず日本語を手で追加。

追加したら実際に[Test]をクリックするとテスト用bot画面がでてくる。「こんにちは」といれたら「こにゃにゃちは~」と返してくれる。動きはOK。

先ほど入れた「ういっす!」も候補として出してきてどの回答がよいか選んで、と言われてるので「ういっす!」を選び上部の[Save and retrain]ボタンをクリックすると元のデータごと書き換える。再度「こんにちは」と入れると「ういっす!」が戻る。ああ楽しい。最低限必要な質問はここで全部登録しときたい。データの突合せまで一人でできるのありがたいなあ。

[Publish]ボタンで以下の画面に移動、[Publish]するとWeb APIとして使えるようになる。

出来上がったサービスをサンプルをもとにC#で使ってみた。query「hi」に対してresponseString内に「Hello」が戻る。あ、黒塗りは鍵なので隠してます。

今度は「こんにちは」を渡してみる。えええ・・・500ステータスが戻ってきました。なんか間違ってた?Testでは使えたのですが。色々試したものの解消はできず。多分自分がJSONの書き方わかってなくてわるいと思うので、寝て明日また考えます

FAQへの返答だはBotでやりたいことの典型例だから、これ何気に便利。

先ほど見つけたMicrosoftの佐藤直生さんの資料にQnAMakerが早速掲載されていたのを発見したので他の新機能などはこちらを参照してもう少し調べる予定。

docs.com