Excelに英文を打ち込んだら、読み上げた音声ファイルmp3を返すサイトの制作

2018年10月7日プログラミング

English Excel to Speech

ちょうど昨年の9月頃に、English Excel to SpeechというWebアプリを作りました。

English Excel to Speech (サーバが遅いので、読み込みに時間がかかるかも知れません)

English Excel to Speech (xls2speech.shizuka-na-kazushi.style) (2019/2/11更新: 新しくサーバを立てました)

 

ブログもやってなかった時に個人的な技術的興味のために作ったものです。最近までほったらかしだったのですが、たまたま、思い出しました。

元はと言うと、子供の英語の教育に悩む奥さまにお願いされて作り始めたのです。

中1だった子供が、英単語の一覧のプリントを学校からもらってくるのですが、発音がわかりません。見かねた母親から、プリントに書かれている単語を、読み上げて欲しいという要望です。

 

ネットで調べたところ、英文を英語の読み上げしてくれる技術はそこら中にあります。そういう技術を組み込んで作ってみた、というのがこのプログラムです。

以下、English Excel to Speech サイトより:

Excelファイルに縦に並べた英単語を、 MicrosoftのText to speechエンジン を使って、読み上げてその結果をmp3の音声ファイルに保存します

中学生の子供の英語の教材に出てきた英単語を、Excelファイルに順番に並べて打ち込めばその音声読み上げmp3ファイルを使って繰り返し学習ができます

 

Webアプリの技術要素

私は、仕事ではITバブルと言われていた2000年代の前半(古い!)に、Webサービスで主にクライアント側を担当していたことがあります。最近は仕事も変わり、組み込み系の技術に触れることの方が多いです。とは言え、残念ながら自分でプログラミングすることはありません。
Webアプリの制作は、本当に週末プログラミングで、趣味の活動です。一通りアプリを作ってみて、
”あー、なるほど、世の中こうなっているのね?”
と実感を得るのが楽しいのです。
という訳で、本日は、English Excel to Speech を作るにあたって、学んだ技術要素をまとめてご紹介します。

開発言語:Python

Pythonを使います。バージョンは、去年(2017年9月)時点の最新版だったと思いますが、3.5.2を使いました。Pythonは2.x系と3.x系で挙動がかなり変わっています。どちらも変わらずに動作するようなプログラミングのテクニックもあるようですが、そこは趣旨が違いますので、気にせずに3.x系で実装しました。

TIOBE Indexによりますと、プログラミング言語のランキングで、Pythonは4位。去年の同時期は、C#が4位だったみたいですが、1ランク上がっています。私は、仕事では以前、WindowsのC/C++を使って実際にコーディングしていました。
次に学ぶ言語としては、Pythonは良いのではないでしょうか。
プログラミングランキングOct2018
Pythonの特徴としましては

  • 高級言語で対話型(非コンパイル)で使えるのでお手軽
  • 関連ライブラリーのバージョン管理(pipというツール)が、サーバへのdeployに便利
  • 高級言語でありながら、最近のトレンドであるデータ解析やAIといった数値計算も高速に行える
  • バージョンや使用ライブラリが異なる複数の実行環境を1つのシステムに作成・管理し、簡単に切り替えて使える(バーチャル環境)

などがあり、結果として、関連技術が異様に発達して、現在も便利に使える言語として日々進化しています。
例えば、Jupyter notebook はChromeなどのWeb browserで動作するPythonの環境です。実行プログラムから実行結果までnoteとして保存できるので、学習用途に最適。私のような週末プログラマーで、忘れっぽい高齢者でも、作業状態を保持しておけます。
AIといえば、TensorflowKeras といった有名ライブラリもPythonで利用できるようになっています。
すごいところは、これらのライブラリやツールのインストールが、WindowsでもLinuxでもMacOSでも、"pip install"という魔法のコマンドで簡単にインストールしてバージョン管理までやってくれるのです。

フレームワーク:Django

Webアプリケーションを作成するにあたり、使用したWebアプリケーションフレームワークはDjangoです。Djangoは、Model, View, Controllerが綺麗に分離した設計になっていて、手軽にアプリが作れます。
今回のアプリケーション(English Excel to Speech)はデータベースを使いませんでした。DjangoのModelは完全にデータベースの操作や構造を隠蔽して、PythonのClassのインスタンスとしてアクセスすることでデータベースを操作することができます。大規模なシステムで運用することもよく考えら得れていて、データベースのマイグレーションをするツールもあり、運用時点でのデータベースの構造変更も手軽に間違いなくできるよう、工夫されています。
Djangoには、Viewは便利なtemplateの機能がついていますので、大方の画面イメージは、特殊なHTMLで記載しておき、動的に変わる値は、Controllerが作る(今回の主な実装ポイント)という感じのアプリになります。
このフレームワークのいいところは、djangoで作ったWebアプリケーションがポータブルなこと。つまり、どこかでアプリをつくれば、そのアプリをdjangoでつくった別なシステムに、手軽にdeployできること。今回のサイトは、"xls2s"というアプリひとつでできているサイトですが、例えば、ここに掲示板のアプリとか、ショッピングサイトのアプリとか、追加していくのが簡単、ということです(やったことはありませんが)。

サービス:Microsoft speech API

音声合成(Text to speech)のサービスは、Microsoftのものを使用しています。
Bing Speech : オーディオをテキストに変換、インテントを理解、自然な応答としてテキストを音声に変換
このAPIはCognitive serviceという一連の「認識」系の機能の一つとして提供されています。Azureのアカウントを使ってある程度無料で使用可能なものになっています。API経由でテキストを送ると、その結果としてMP3など、音声ファイルを送り返してくれるようなサービスになります。
音声の出力フォーマットは、32kbpsから、128kbpsまで、選択可能。ファイルフォーマットも、rawでーたやriff形式が選択できます。
また、面白いのは、gender(男性か女性)を選んだり、同じ英語でも、インド人が話した英語のようなアクセント違いの発話にも対応しています。

ライブラリ: Excel readなど

“pip list"コマンドで出てくる、ライブラリ一覧は以下の通り。
特徴的なのは、excelファイルを読み込むための、xlrdや、読み込んだ後に、excelのデータ一覧から順番でデータを取り出して操作する為の、pandasのDataframeを使っているあたりです。
Django (1.11.2)
numpy (1.13.1)
pandas (0.20.3)
pip (9.0.1)
python-dateutil (2.6.1)
python-http-client (3.0.0)
pytz (2017.2)
sendgrid (5.2.0)
setuptools (36.0.1)
six (1.10.0)
wheel (0.29.0)
xlrd (1.0.0)

開発環境:PyCharm

PyCharmは、エディタやデバッガが付いている統合開発環境(IDE)です。Pythonの開発ではひと通りこの環境で達成できます。
Pythonのバーチャル環境にも対応していますので、複数の環境の複数のプログラミングをひとつのIDEで開発できます。
エディタは、当然、予測入力や文法チェック、構文チェックがついていますし、ライブラリの依存関係などもチェックしてくれる、すぐれもの。関数の定義へジャンプしたり、コメントがあれば、関数を使ったプログラムのコーディングの時にコメントの表示もしてくれます。
ソースコード管理(バージョン管理)は、GitやGitHub、CVS、Subversionなど一通りそろっています。
今回のアプリケーションは、AzureサーバへのdeployにGitを使った方法を選択しました。ローカルに作ったrepositoryへの操作が、PyCharmからできて、加えてサーバへのdeployにも便利でした。

サーバ: Azure

音声合成のサービスにMicrosoftを使ったので、サーバも一応、Microsoftを選択してみました。
Microsoft Azure : あなたのビジョンを、あなたのクラウドで。
以前は、サーバはコストがかかるのが常でしたが、開発中のサイトを公開するくらいでアクセスが多くないのであれば、タダで使えます。
Pythonで作ったアプリもちゃんと動かせます。djangoも確か公式ドキュメントがあった気がしますが、何しろ1年前の作業だったもので、忘れてしまいました。。。
前述のようにpythonの仕組みで、pip freezeを使ってライブラリのバージョン管理がされていますので、昔(古い)のようにサーバに使用ライブラリをいちいちインストールする手間はありません。非常にすんなり最初のdeployが進んだ記憶が。(ごめんなさい忘れました)

2019年2月11日加筆:

現在は、このプログラムは、Azureでメンテナンスが大変なので、本ブログを運営している、エックスサーバに引っ越しをしました。

(こちらで運用中→xls2speech.shizuka-na-kazushi.style

実は、エックスサーバに移行するにあたり、djangoのデプロイに相当苦労しました。その奮闘記もブログのネタにしております。

関連記事: エックスサーバにDjango+Pythonのデプロイが上手くできない話(未解決)

まとめ

ざー、と書くと色々な技術要素が出てきました。ただ、私、日曜日にプログラミングする週末プログラマー。このような技術を駆使すれば、週末だけの時間を使って簡単にWebアプリを公開できてしまう。しかも、パソコンが自宅にあれさえすれば、お金をかけずに、一人で。世の中進歩しています。