仕事の備忘録

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

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

前回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使ってみたの文字化け

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データを自動更新させるようにした

2017/06/08 追記

もうすぐ無料版での共有機能が使えなくなります。なので記事内でのタダでありがたいというのは無しに。残念。詳細はこちらの記事をご覧ください。

testedquality-tech.hatenadiary.jp

 

 

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

金曜日の夕方上司から「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 動画加工をコマンドラインで行うよ

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

今回利用予定は「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誕生

 こんにちは。今週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が早速掲載されていたのを発見したので他の新機能などはこちらを参照してもう少し調べる予定。

 

※2017/4/13追記 この記事の後上記500エラーは解決したのでした。下記参照のこと

testedquality-tech.hatenadiary.jp

祝!Power BI Embedded 東日本リージョン登場

Microsoft Azureを使いたくて個人的に追っかけて数年。無茶苦茶スピードに乗った進歩具合に必死に追いかけつつ数年。アピール実ってAzureを業務利用調査を開始した1年でした。色々調査していましたが、いま面白いと思い社内で布教しているのが「Power BI Embedded」というサービス。

2017年にサービスインしたのですがが、今月2日に参加したイベントConnected();ではまだ東南アジアリージョンしかなかったのです。なのに25日にサイトをみたらなんと東日本リージョン来てるじゃん!

ということで東日本リージョン登場を祝しまして、Power BI Embeddedを紹介させてください。

azure.microsoft.com

元々Power BIというビジネス分析サービスをMicrosoftが提供しています。

powerbi.microsoft.com

こちらはDesktopアプリ&Webサイトという構成で無料利用可能で、Power BIを使ったデータ視覚化はかなり強力&簡単。

が、作ったグラフなどを他の人とやり取りするためにはアカウントによる組織管理が必須となりまして、ほいほいとやり取りするにはちょっと敷居が高かったのです。(Office365などがすでに導入されている組織なら最強だと思いますねどね)

百聞は一見に如かず。デモサイトがあるのでこちらを見ていただきたい。

Northwind Traders

対話型のグラフが普通にWebサイト内で表示されてますが、この部分がPower BI Embeddedによる提供。飛行機のエンジンの部分別故障件数が右のグラフをクリックすると、左のイラストと連動するのです。こんなグラフが簡単に利用可能なの本当にありがたい。「Power BIの機能を、アカウント管理なしで普通にWebサイトで使いたいなあ」という贅沢な願いをかなえてくれるのがPower BI Embeddedです。

但しこんな素敵なPower BI Embeddedですが利用条件があります。価格表に明記されているあたりをコピーしてみる。

azure.microsoft.com

(1)Power BIサービスの代用ではないこと=Power BI Web版のコピペサイトはだめ。(2)サードパーティとして提供すること=自社組織内部のWebサイトの一部提供とかはできない。とか制限事項があります。FAQなどを詳細参照してください。

基本的にはシステム開発会社が自社で売り出すサイトの一部として組み込む想定となります。また価格表をみるとわかりますが、通常のPower BIが利用者ごとで月額制課金に対してPower BI  Embeddedはセッションという単位での課金で、支払いはWebサイトの運営者となります。

1時間1ユーザがずっと使い続けると1セッション。

10時間使い続ける人がいたら10セッション。

100人アクセスで1時間使ったら100セッション。1日510円。30日使ったら15300円。

もし1000人なら30日15万3000円。1年間200万弱でそれなりの人数むけのシステムに対してグラフィカルな対話機能を提供できるのですね。うむ。

無料枠があるので開発である程度お試しが可能です。ぜひ一度使ってみてください。面白いよ。サンプルPGでのお試しがラクチンです。このドキュメントを参考にしてみてください。

docs.microsoft.com

高級スーパーほど安い品物ってなーんだ?

この2年くらい色んな店であるものを買うようにしている。

それは、精肉コーナーがあればどの店も置いてある。

そしてそれは、この2年間ほどの経験則からすれば、確実に高級食材を扱う店ほど安い。

 

高級店ほど安い。この現象に気づいたのは1年くらい前。その後店舗を色々と変えてみて改めて思う。安い。もしくは同じ値段で確実に品質が上がる。

そんな商品残念ながら私は他に知らない。

 

それは、焼き鳥屋で1本100円とかで売っている「鳥皮」である。

鳥皮~!?

って普通に家で食べるのか?と言われると分からないが、鳥皮はうまい。焼き鳥の持ち帰りで一番買うのは我が家は鳥皮である。なのでたまに自宅で料理して食べている。ちなみに私の実家がある博多では、焼き鳥屋は家族で夕飯を食べる場所である。我が家も休日に父親が平日通う飲み屋、焼き鳥屋に家族で夕飯に出かけていた。

 

さて、我が家近辺で鳥皮を買うのに一番安いのは某百貨店である。

この百貨店、もも肉が100g300円とかの高級鶏肉の鳥皮が100gでなんと20円だ。500gで100円。鉄腕DASHの茂子さんもびっくりの価格である。

『茂子の節約家族』

ほかの店で20円はこの2年見たことがない。多分これが近隣の底値である。そして精肉コーナーに行くたび値段を見ているうちに、もう一つのことに気づいた。

鳥川は高級店で買うほうが確実にいいものを安く買える。

普通の大手スーパーなら国産鶏肉の鳥皮は50円が標準くらい、そしてあるスーパーでは80円と高額で正直びっくりしたのだった。

この80円の店はもも肉で108円だったりする。単純に買う人が増えるから高いのか?と思ったがちょっと違う。

色々考えたが、この値付けは安いものを探している人にぎりぎりのラインの金額で提示しているのだ。だって精肉コーナーで一番安い製品だ。そこでも儲け出したいもんね。そう考えると、こんな小さな一つ一つで取りこぼさない80円を付けたスーパーは、正しいのであった。逆に鳥皮に目を向ける人がいない百貨店では20円を付けないと、買う人がいないのだろう。こんな鳥皮好きの人間以外は。

 

しかし鳥皮ひとつで色々考えて喜んでいる自分がちょっと気持ち悪い。旦那にこの発見を伝えたら「ばかじゃないの?」という感じでスルーされたので、ここに記載しとく。