OTOBANK Engineering Blog

オトバンクはコンテンツが大好きなエンジニアを募集しています!

音声認識で文字起こしをしてみた

こんにちわ。@mrtryです。
今月の頭に、地元に帰る用事があり、先月のブログで書いたまつりやという回転寿司にいってきました。
いっぱい食べました。めっちゃ美味しかったです…!

f:id:symmt9302:20170227105300j:plain

さて今回は、先日社内LT(Teck Talk)で発表した内容を記事にしてみました。
音声認識を利用して、取材で録音した音声を自動的に文字起こしすることはできるのかというテーマで発表しました。

この話の背景

ある日、弊社の新刊JPの記者さんと飲んでいた時のことです。
記者さんが、「取材をするとき、基本ICレコーダーで録音しておいて、あとで聞きながら文字に起こしたりするんだけど、結構面倒だし、外注したりもするんだよね。プログラムでいい感じにならないですか?」と言われました。
その話を聞いて、「音声認識でイケそうな気がしますね〜。やってみますね〜。」と答えたので、ちょっと試してみました。

音声認識とは

そもそも、音声認識とは何でしょう?
とりあえずwikipediaを見てみると、以下のような説明があります。

音声認識(おんせいにんしき、英: speech recognition)とは、人間の声などをコンピューターに認識させることであり、話し言葉を文字列に変換したり、あるいは音声の特徴をとらえて声を出している人を識別する機能を指す

wikipedia: 音声認識

こんな感じで、音声認識という言葉は、声などをコンピュータに認識させるもの全般を指しています。
具体的には、

  • 音声から文字を起こす
  • 音声から感情を把握する
  • 複数人の音声から、それぞれの人ごとに音声を分離する

などがあります。
ちなみに、私は学生の頃に音声が歌声なのか話声なのかを識別するという研究をしていました。

今回は、会話を文字に起こす(Speech To Text)という音声認識を試してみます。

利用したもの

今回は、個人的に最近気になっていたIBM Watson Speech-to-Textで試してみたいと思います。
セットアップとか面倒なことしないで、ざっくりお試ししたい程度の気持ちだったので、Speech-to-Textのデモページを利用することにします。

なお、その時利用した設定は、以下のスクショを参照してください。

f:id:symmt9302:20170227105733p:plain

実際にやってみた

文字起こしを試す音源として、弊社で販売しているオーディオブックのサンプル音源テープ起こし入門サイトの練習音源で試してみます。 なお、デモページのファイル形式の都合上、元の音源はmp3からwavに変換し、サンプリングレートを16kHzにして書き出したものを利用しています。

オーディオブックのサンプル音源で試す

影響力の武器 第三版: なぜ、人は動かされるのかのページにあるサンプル音源でやってみたいと思います。 (ちなみにこの作品は、私が買ったオーディオブックで一番聴いてる作品です)

以下、実際に出力されたテキストです。 気になった方は実際の音声と、出力されたテキストを見比べてみてください。

前にも少し述べましたが他の全ての影響力の武器と同じように。社会的証明の原理にも。その効果が強くなるいくつかの条件があります。
その一つが不確かさです。
同振る舞いがいいのか確信が持てない場合に。人が普段よりいっそう他者の行動を参考にして自分の行動を決めるようになるのは間違いありません。
それに加えてもう一つ重要な条件があります。類似性です。
社会的証明の原理は自分と似ている人の行動を見ているときに最も強く最後します。
同振る舞いばいいのかを考えるとき。一番参考になるのは自分と類似した他者の行動です。
したがって私たちは自分と異なる人よりも類似した人が示す行動に従いやすいのです。
近頃のテレビではどこにでもいそうな普通の人が商品を推奨するコマーシャルがよく流れていますが。その理由もここにあると思います。
広告主は商品の最も大きな潜在的市場を形成している普通の視聴者に売り込むには他の普通の人々が。それを好んで使っていることを示せばいいとわかっているのです。
ジュースであれ鎮痛剤であれ洗剤であれどこにでもいる平均的な人々の絶賛に人は耳を傾けるものなのです。
人が他者の行動を真似るかどうかを決定するときに。その他社との類似性が重要であることを示すもっと強力な証拠がいくつかの科学的研究によって発見されています。
とりわけわかりやすい例は。ある大学のキャンパスで行われた募金活動の取り組みについての研究結果です。
募金を呼びかける人が私もここの学生ですと言って。学生たちと似た人間であることを主張しそうである以上学生たちもこの同じ目標を後押ししたくなって当然だと暗にほのめかして時にはそうしなかったときと比べてチャリティーへの寄付が二倍以上も集まりました。
この結果は社会的証明の原理の重要な条件を示しています。
私たちは他の人の行動から自分にとっての適切な行動を決定しますが。そうした傾向がとりわけ強まるのはそのほかの人が自分と似ている場合などです。

元の音声を確認するまでもなく、テキストを見るだけで概ねキレイに起こされていますね。
オーディオブックの音声は、音声以外の余計な音(要はノイズ)がなく、文字起こしするには理想的な音声なので、キレイに起こすことができたのではないか、と思いました。

文字起こし入門サイトの練習音源で試す

今度は、実際の文字起こしの依頼で来るであろう音声の例として、以下のテープ起こし入門サイトの練習音源で試してみます。

以下、実際に出力されたテキストです。 気になった方は実際の音声と、出力されたテキストを見比べてみてください。

ヘッドも映画の中に挟まれてきてビジュアル化は持ってくるわけですから法を右折そういうの一千万画素。
アミノ酸は新しい情報を信じて下さい。
うん遊びをお客さん販促よ。
話だよ遊ぶことができるします。
MRFからちょっと離れている&会社がすぐ。
ええには英語欲しいとかいる政策が発足の。
笑知れたらすぐもうほんとね三行ユニフォーム出雲反射の演出もあることができたらすぐに自分。
株なんですか。
うん光を。
でも私も半分です。

先程のオーディオブックで試したテキストと比べると、なかなか、意味が読み取れないテキストになってしまいました。 音源を載せていたサイトに、音声から起こしたテキストがあるので、比較してみます

皆さん方もね、だんだんだんだん年齢重ねてきて、あのー、20代がこれからはね、追ってくるわけですから、多分ぼーっとしていると、そういう元気のいい人にばっといきなり抜かれちゃうんで、とにかくね、あの、新しい情報を仕入れてください。で、あの、それをお客さんに返すことによって、またお客さんから信頼を勝ち取ることができるかもしれません。特に、あのー、インターネットからちょっと離れている、あの、アナログな会社なんかは、すごく狙い目でね。で、皆さん、今、テープ起こしとかWEB制作とか、何か一つの職種でやってらっしゃると思うんですけど、もうちょっと何か目先を広げて、複合的にその会社の、えー、力になることができたら素晴らしいと思うんです。それでまず、あのー、いっ……何て言うんですか、えー、きっかけをね、得てほしい。どっかからでもいいです。

テープ起こし はじめの一歩:第6週 逐語記録見本: テープ起こし はじめの一歩

声に出してみると、似てなくもなさそうな箇所があったりしますが、全然一致していませんね…。

原因としては、元の音声の品質が悪いということがあげられるかと思います。 先程のオーディオブックの音声と比べると、この音源は以下の点で品質が劣っています。

  • 定常的なノイズ(サーッって音)が乗っている
  • 部屋の反響音が強く、声が明瞭ではない
  • 音割れがある

特に、部屋の反響音が強く、声が明瞭ではないという点が問題にありそうです。
音声には、母音や子音ごとに特有の周波数パターンがあり、それを見ることで、発声されている言葉を識別することができます。 今回の音声は、反響音が強いために、音声に余計な音が付与されてしまい、言葉を識別するのが難しくなり、意味不明な文章が生成されたのかな、と感じました。 (詳細が気になった方は、フォルマントMFCCで検索すると、幸せになれます)

取材の音声を貰ったとすると、きれいに文字起こしできるのか?

ふたつの音源で文字起こしをした結果を踏まえて、取材の音声を文字起こしできるかを考えました。 以下の条件を満たしていれば、おそらく良い感じに文字起こしすることができるのではないか、と感じました。

  • 外部ノイズ(環境音、BGM)が少ない
  • 音声が明瞭に録音されている
  • 発話者の滑舌がある程度キレイである

おわりに

今回は、IBM Watson Speech-to-Textを用いて、音声の文字起こしをしてみました。 音声の品質に依るところはありますが、録音時点から気を使うことができれば、いい感じに自動で文字起こしができそうなことがわかりました。 機会があれば、記者の方と連携して、実際の取材音声で文字起こしを試してみたいな、と思っています。 その際は、またブログの記事にして、紹介してみたいと思います!

2017年1月のどや会ごはん - バインミー☆サンドイッチ -

こんにちは!

分厚い本を読むのが苦手な@perokoです。

突然ですが、オーロラって見たことありますか?
私は、お正月休みを利用して人生初のオーロラを見るために、イエローナイフ(このへん)まで行ってきました!
バンクーバーまで8時間40分、そこからカルガリーを経由してイエローナイフまで6時間と、結構時間がかかるんですね〜〜〜。

飛行機の中ではなるべく休息をとりたかったのですが、眠ろうにも眠れない。
集中して映画を見る気分でもない。

うーんどうしたものか。

その時、私は気づいてしまったのです。
「こんな時こそオーディオブックなんじゃない!?」(いまさら)

というわけで、今回の旅行ではオーディオブック版「星を継ぐもの」にお世話になりました。(ステマ www.febe.jp

ドラマ「半沢直樹」にも出演されていた、森田順平さんが朗読しているのですが、
想像を邪魔しないのに、圧倒的な演技力で気持ちいい。
SF小説好きな方はぜひ聴いてみてください〜O[ -ω - ]O♬”

f:id:peroko_tokyo:20170201202215j:plain

さて、前置き長くなりましたが、
毎月恒例の「どや会」レポートです٩(^‿^)۶

オトバンク開発部では毎月末に月次の締め会として「どや会」を実施しています。
その月に開発したすごい機能、すごいデザイン、すごい改善を共有(どやぁ)して1ヶ月に区切りをつけ、「来月もすごい機能を開発するぞ!」と思える(といいな〜)というねらいで運営しております。

今月のどや会ごはん

今月のどや会ごはんは、ベトナム庶民の味「バインミー」!!
軽いフランスパンに、なます・パクチー・肉を挟んだめちゃくちゃおいしいサンドイッチ。

高田馬場の人気店でテイクアウトしてきました〜! entabe.jp

f:id:peroko_tokyo:20170201202532j:plain 券売機のある店内にはお客さん一人分のスペースしかない小さなお店。(テイクアウトオンリー)
初めて食べるなら、ベトナムレバーペーストがおすすめです。

f:id:peroko_tokyo:20170201202616j:plain バインミーの他にもベトナムっぽい食べ物を用意しました〜!

  • KALDIのパクチーポテトチップス
  • パクチーチップス
  • パクチー天
  • パクチーポップコーン
  • パクチースープ
  • ベトナムビールの「333」
  • 生春巻(うまい

いいね〜こういうの!いい!!!

f:id:peroko_tokyo:20170201202429p:plain ちなみに、メニューのリクエストはsimple poll@slackで集めました〜

TechTalk

先々月からTechTalkという”自由発表コーナー”を追加しました!

f:id:peroko_tokyo:20170201222428j:plain

TechTalkの様子。
今回は入社1年目の@symmt9302が音声認識について発表してました(雑)
(せっかくだから軽くブログに書くといいよ!)

TechTalkのねらい

ねらいとしては超ベタで「チーム全体の技術力向上」がねらいなのですが、
実はそれだけではなくて、メンバー個人の市場価値向上のためにも活用してほしいという想いもあります。

もちろん転職はしてほしくないけれど、
人生で一度も転職しないことの方が珍しい時代なので、もし、やりたい仕事がオトバンクで実現できないなら転職を応援したいし、転職するなら良いキャリアを築いてほしいな〜〜〜〜。(って、弊社CTOが言ってた気がする)

余談

f:id:peroko_tokyo:20170201213214j:plain 弊社のデザイナーさんが作ったアイシングクッキーがすごかった

それでは、来月も頑張りましょ〜〜!

Symfony2で利用されているDoctrineに入門する(前編)

こんにちわ!@mrtryです。

年末年始は北海道へ帰省して、寿司を毎日食べてました。
まつりやという回転寿司が最高なので、北海道へ行く機会があれば、ぜひ!

さて、「Symfony2入門」の6回目の記事です。

今回からは、Symfonyで利用されているORMである Doctrine についてまとめていきたいと思います。
内容としては、Doctrineの紹介から、CRUDをするまでの流れについて書いていきたいと思っています。

以下、今回の記事の目次になります

  • Doctrineとは
  • Doctrineがデータ取得するまでの流れ

Doctrineとは

Doctrineとは、Symfonyで利用されているORMです。
ORM(Object-relational mapping)とは、RDBから取得した情報を、特定のクラスと関連付けてオブジェクト化する仕組みです。
この仕組みにより、RDBのテーブルやSQLをほとんど意識せずに、直接オブジェクトとして保存や取得することができます。

簡単な例

文章だけで説明するのも想像しにくい気がしたので、
Doctrineを利用して、CRUD操作する例を簡略化して紹介します。

RDBにproductというテーブルがあって、カラムにprodut_id name price があったとします。
Doctrineを利用すると、productテーブル の作りを元に、以下のようなProductクラスが作成されます。

class Product
{
    private $productId;
    private $name;
    private $price;
    
    ...
}

このクラスのプロパティを変更し、Doctrineに渡すと、RDBを操作することができます。
これにより、SQLをその都度書く必要がなく、RDBの情報操作をオブジェクト指向的に扱うことができます。

例として、以下のような感じのコードを書くことでCRUDすることができます。
(正しさよりも、まずは雰囲気を掴んでほしいという意図で、実際に必要となるコードの一部を端折っています。)

// create
$product = new Product();
$product->setName('apple');
$product->setPrice(100);

// read
$product = $this->getDoctrine()
        ->getRepository('AppBundle:Product')
        ->find($productId);

// update
$product = $this->getDoctrine()
        ->getRepository('AppBundle:Product')
        ->find($productId);
$product->setPrice(100);

// delete
$product = $this->getDoctrine()
        ->getRepository('AppBundle:Product')
        ->find($productId);
$em->remove($product);

また、今回は紹介しませんが、
Doctrine Query Language(DQL)と呼ばれるQuery Languageも用意されており、
SQLのように、クエリを書いて操作することもできます。

Doctrineがデータを取得するまでの流れ

Doctrineを介して情報取得するまでの流れは、以下のようになっています

  1. アプリからDoctrineを呼び出し、情報取得の依頼をする
  2. RDBの情報が記述されている マッピング定義 を読み込む
  3. DoctrineがRDBにアクセスし、リクエストに対応する情報を取得する
  4. マッピング定義 から、リクエストに対応する エンティティクラス を特定し、読み込む
  5. RDBから取得した情報をプロパティに設定し、インスタンス化する
  6. インスタンス化したエンティティを呼び出し元に返す

この流れの中で重要な要素として、 マッピング定義エンティティクラス のふたつがあります。
それぞれについて、説明します。

マッピング定義

アプリケーション内のクラス、プロパティと、RDBのテーブル、カラムの対応関係を定義しているものです。
ざっくりなイメージとしては、 ER図の内容を設定ファイルとしたもの といった感じです。
この定義を元に、DoctrineはRDBから情報を取得し、エンティティにプロパティを設定します。

エンティティ

Doctrineがマッピング定義を元に取得した情報を格納する入れ物です。
識別子(ID)を持っていて、テーブル内の1レコードに対応しています。
最初の方に書いた例で行くと、Productクラスがエンティティにあたります。

おわりに

Doctrineの紹介と情報を取得するまでの手続きについて紹介しました。
次回は、実際にDoctrineを利用し、CRUDをしてみたいと思います。

また、この記事は、@mrtryの勉強の一環で書いていますので、
お気づきの点などがありましたら、コメント等でご指摘いただければ幸いです!

参考