知らないことを調べるブログ

映画の分からないところを調べてまとめる場所にしていきます。

フォルダにある全てのtxtを音声合成mp3にするPythonコード(open-jtalk)

 教科書の復習に音声合成がべんり。Windowsではsoftalkを使っていた。でも、Linuxで使えるソフトがぱっと見つからない。なのでPythonで作った。open-jtalkを使った。

jtalk.py

# -*- coding: utf-8 -*-
u"""フォルダにある全てのtxtを音声合成mp3にする."""
import subprocess
from pydub import AudioSegment
import glob
import os


def jtalk(i, t, n):
    u"""
    日本語テキストから音声合成wavファイルを生成.

    via http://qiita.com/kkoba84/items/b828229c374a249965a9.
    """
    open_jtalk = ['open_jtalk']
    mech = ['-x', '/var/lib/mecab/dic/open-jtalk/naist-jdic']
    htsvoice = ['-m', '/usr/share/hts-voice/mei/mei_normal.htsvoice']
    # 再生速度
    speed = ['-r', '1.3']
    outwav = ['-ow', n + '-' + str(i) + '.wav']
    cmd = open_jtalk + mech + htsvoice + speed + outwav
    c = subprocess.Popen(cmd, stdin=subprocess.PIPE)
    c.stdin.write(t)
    c.stdin.close()
    c.wait()
    # aplay = ['aplay', '-q', 'open_jtalk.wav']
    # wr = subprocess.Popen(aplay)


def text2jtalk():
    u"""フォルダにある全てのtxtを音声合成mp3にする."""
    # フォルダ内にあるtxtの名前をリストにする
    textlist = glob.glob('*.txt')
    for text in textlist:
        n = text.rstrip('.txt')
        # openjtalkは1024バイトまでしか一度に処理できないので、改行で区切る
        ts = open(text, 'r').read().split('\n')
        ts = filter(lambda s: s != '', ts)
        for i, t in enumerate(ts):
            jtalk(i, t, n)
        # 区切って生成したwavを結合する
        s = AudioSegment.from_wav(n + '-0.wav')
        os.remove(n + '-0.wav')
        for i in xrange(len(ts) - 1):
            s += AudioSegment.from_wav(n + '-' + str(i + 1) + '.wav')
            os.remove(n + '-' + str(i + 1) + '.wav')
        # mp3で書き出す
        s.export(n + '.mp3', format='mp3')
        print n + '.mp3'


if __name__ == '__main__':
    text2jtalk()

ほげほげ.txt

今日はいい天気ですね。
ほげー

にゃーん.txt

にゃわわ・・・

 上記3ファイルを同一ディレクトリに配置してjtalk.pyをビルドすると、ほげほげ.mp3とにゃーん.mp3が生成される。


 open-jtalkは、テキストのうち1024バイトまでで処理が止まるようにデフォルトで制限されている。なので、文章を改行で区切って複数個音声を作って、最後にpydubで結合することで対処した。なので改行されずに300文字ちょっと続くとトリミングが起こる。エラーは出ない。適度に改行しよう。

 固定長で300文字ずつ区切ればいいんだけど、Pythonでマルチバイト文字をカウントする方法がわからない。しょうがない。

 ちなみに、open-jtalkはCで書かれたソースファイルの定数に1024と書かれているらしい。それを書き換えればいけるとネットで見た(参考1)。でも、apt-getでインストールしたときどこにソースファイルがあるのかわからない。apt-fileで探しても、

apt-file search open_jtalk
open-jtalk: /usr/bin/open_jtalk
open-jtalk: /usr/share/man/man1/open_jtalk.1.gz

アーカイブの場所しか表示されない。ソースファイルはどこにあるの?

参考1 openJTalkを10.6にインストール(1) « こざくらラボ

道具が増えた

 趣味でやっているWebサイトの作り直しがおわった。公開して、お疲れ様とねぎらいをもらった。

 

PHPだったところがCGIに置き換わった。壊れているところを直した。DBを整頓した。ファイルを圧縮した。その結果、仕組みのわからないコピペコードがなくなった。ファイルの形式がそろった。管理作業の大部分が自動化された。Webサイトが軽くなった。

 

 Pythonのモジュールに触れられて良かった。よく使ったのはreとsqlite3とMySQLdbとftplibとlxmlとcgi。アンドロイドアプリ開発と合わせて、二ヶ月ほどPythonをぽちぽち触った。

 

 小さいコミュニティなので、ぼくが作ったサイトをここで明らかにはしない。id:Hokanokoとそのサイトを関連付けることは避けたほうがいいように思う。承認欲求がないことはないけど、コミュニティのインフラみたいなサービスなので、個人の色が付いてしまって利用者が限られることのないようにしている。

 

 ここからちょっともやもやした考え(……とサービス開始当時から考えてきたのだけれど、最近は誰がやっているか明らかになったところで、利用者は別に気にしないんじゃないかと考えている。運営者がとんでもない嫌われ者でもない限り。そのコミュニティでいろいろ発言しているとき、一時期「ぼくはみんなから嫌われているのでは?」みたいな自意識があったんだけど、これは著しくバランスを欠いた意見だと最近気付いてきた。「ああ、そんな人いるね」「ずっとサービスを続けているのは、まあ助かるよね」ぐらいのバランスなんじゃないかと思う。誰かを嫌い続けるのってエネルギーのいる行為だし、そんなエネルギーがぼくに向けられているとはちょっと思えない……。)もやもやおわり。

 

 そんなわけで、reとsqliteとKivyという道具が増えたことがうれしい。あと、最近仲良しになった人とよく話していて、お互いいい感じに敬意がある感じなので、それが楽しい。

すべてPodcast Addictで叶った

 ぼくが欲しかったいい感じの音楽プレイヤーはPodcast Addictだった。欲しかった機能は

  • Podcast購読
  • フォルダのオーディオブック化
  • 再生速度変更
  • ファイルの自動削除

とかだいたいこんなところで、それらがすべてPodcast Addictで叶った。再生速度変更とファイルの自動削除はフォルダごとに設定できるので、日本語の番組だけ1.3倍速にできるし英単語は何回も聞ける。

 自作しようとしていたけどうまくいかないし、これで十分に満足できる。ぼくはAndroidアプリ開発をやめた。

 KivyでのAndroidアプリ作りで詰まっていたのは、一時停止/再生キーをBluetoothで受け取る機能の実装。5日かけてできなかった。ヘッドホンが外れるとAUDIO_BECOMING_NOISYが出るのでそれを受け止めるBroadcastReceiverをサービスに仕込んで、実際に受け止めることはできたんだけど、一時停止/再生キーが押されると出るはずのMEDIA_BUTTONを受け取ることができなかった。actionsに追加したのに、なんでだろう? エラーログはどこにあるんだ?

 でも、Kivyを触るのはとても興奮する体験だった。Androidの仕組み(と開発するためのLinuxの仕組み)に触れることができた。めちゃくちゃ楽しかったな。簡単なアプリなら作れるようになったのがとてもうれしい。エラーログの場所はいまだにわからないけど……。



 Android APKをビルドするためにWindows10とデュアルブートしたLinux mintは、Windows10と違ってアップデートのための通信を裏で勝手にしないし、Windows10よりもターミナルがきれい。ぽちぽちさわっていてとても快適で楽しい。つらいところは、Office作業のためにMSフォントを入れるといくつかのWebサイトが汚くなるので入れられないのと、デュアルブートなのでdropboxの同期先に困るのがちょっとつらい。でも、Windowsはもういらないな。

 JavaではなくKivyでやっている理由はPythonを勉強したいからだった。Androidでのレベル上げはいい感じだった。次は、個人でやっているWebサイトの再構築をやろうと思う。

Linux mint18 mate 64bitをWindows10とデュアルブートした(aspire es1-131)


 Linux mint18 mate 64bitをWindows10とデュアルブートした。入れたのはacer製のaspire es1-131ノートパソコン(windows10)。手順は、

  1. HDDに未使用領域を作る(150GB用意した)。
  2. 64bit版isoファイル(1.7GB)を用意する。Linux mintの公式サイト(参考1)からダウンロードした。
  3. DVD-Rにさっきのisoファイルをwindows10機能の「ディスクへ書き込む」で書き込む。
  4. BIOS(再起動してメーカーロゴ画面でF2)でUSB CDROMのブート優先順位を一番上にする。再起動。
  5. Linux mintがDVDから起動される(やった!)。HDDの未使用領域にLinux mintをインストール
  6. 再起動してBIOSに行き、セキュリティタブでsupervisorに適当なパスワードを設定(aとか)。グレーアウトしていた項目が有効になる。
  7. 信頼できるuefiファイルを設定。「HDD0/EFI/ubuntu」に潜ると「grub64.efi」がある。
  8. 設定したuefiファイルがブート優先順位に追加される。それを一番上にして再起動。

でやった。できた。それからアップデートとかソフトのダウンロードとかで2GBくらい通信した。Linux mintのインストールはそんな感じ。

参考1:
www.linuxmint.com





 僕がlinuxを入れた理由は、kivyをandroidで使うためのビルドツール「buildozer」がlinuxでないと動かないため。しょぼいパソコンでは仮想環境が重くてつらいらしいし、じゃあデュアルブートするか! できた! 使いやすい! いえーい! が今。10年前に一瞬だけubuntu(lubuntuかxbuntuのどちらか)を使っていたときはすっごく使いづらかった。

 Linux mintはとても使いやすい。ただ、いまつらいのは、

  • bluetoothが機能しないことと、
  • sublime textでは日本語入力切り替えキーが効かず、Ctrl+spaceを使うことと、
  • sublime textでは無変換キーが効かないこと

がある。bluetoothは、ドライバの認識がうまくいっていないんだと思う。たぶんなんとかなる。

 vimがつらすぎるのでもどしたsublimeは、Windows版との違いはだいぶ慣れてきた。ぼくは「デュアル歩ーと」とか「アンリミテッド・佐賀」とか第一候補されるのが嫌で、これまでカタカナは無変換キーをいちいち使ってきた。なので無変換キーを押すくせがあり、sublimeで効かないことに気づかず完成稿が「じゃあでゅあるぶーとするか!」などとゆるふわになることがあった。まあ困らないのでいいか。。。慣れるし

 buildozerはなにも考えずにターミナルで実行すると800MBくらいダウンロードされ「月3GBの通信制限がおわる!」と恐怖だったけどまあいいかとなり、パソコンは1時間くらいかけてapkを吐いた。かわいい男の子ですよな気持ちだったけど実機で動かすとエラー終了し、夜霧の向こうに見えてきたのはさっきよりさらにさらに高い壁、状況はいまだに向かい風ガッデムこうなりゃ前に進むしかないとライムスターの歌を歌った。

 apacheはかんたんに動いた。PHPレンタルサーバーではCGIモードで動いているんだけど、モジュールかんたん構築の誘惑に負けてモジュールで動くようにした。apacheはエラーログをわかりやすく出してくれてとても良かった。まるで宇宙家族ジェットソンのロボット家政婦みたいな感じ、、、そう考えると親しみが湧いてきた。


 やっとkivyに戻れる。僕はandroidのいい感じの自分用音楽プレイヤーを作りたいのであって、ヤクの毛を刈りたいわけじゃない。





 Rebuild.fmのバックナンバーがあと50ファイルくらいで聴き終わる。すごく楽しくていい。Rebuildを聴いて、ぼくも1文字変数を使うようにした。emacsは使っていない。

 いまRebuildだけ聴いているけれど、聴き終わったら英単語とか他のpodcastとかtbsラジオクラウドも聞くようになる。英単語は忘れそうなころにもう一度復習したい。そのぶん複雑なプレイリストが必要になる。

 これまでitunesでそういうプレイリストを作っていたんだけど、手動であちこち操作するのがつらかった。ぜんぶ自動化するアプリを作るのが僕の目標で、そのためにandroidで使えるワイヤレスリモコンが必要だと思った。で、bluetoothイヤホンでそれが叶った(参考2)。

 いまのところとても快適。バッテリーは6時間もつ。毎晩寝るときに充電している。耳から落ちることもない(左耳がちょっとゆるいけど)。

 ただ、今朝イヤホンが見つからなくなり、毛布の下からすぐにでてきたのだけれど、ちょっと先行きに不安を感じた。ねこがコロコロ転がして運んだらたぶん行方不明になってしまうだろうな。

 でもぼくはもうたぶん有線には戻れない。小型なのでぱっと見てイヤホンをつけているかわからないのがとてもいいし、androidのバッテリーへの影響もさほどないのもとてもいい。なくしたら買い直すと思う。これはいい買い物だったな。


参考2:





 大原の予想解答で自己採点したら50点くらいだったので確実に落ちている。つらい……。犬のアプリ(参考3)だけで勉強していた。知識ゼロから1ヶ月で50点を取れるようになったのはこのアプリのおかげ。落ちたのは勉強不足なので、つぎがんばればいいか。6月か10月にもう一度受験してみよう。

 ポモドーロテクニック(25分やって5分やらないのサイクルを繰り返す)が新鮮で楽しかった。8時間つづけても腰とか肩が痛くならない(休憩中に動くから?)のですごくいい。そのうち飽きちゃうかもしれないけど、気が散りそうなときはポモドーロを意識的にやろうとおもった。


参考3:
pboki.com





 クラシックギターが超楽しくて毎日さわってる。簿記の勉強不足はここからきているかもしれないけど、、、楽しいからいい。けっこう弾ける曲が増えて、いまは

  • サガフロンティア2のテーマ曲
  • スーパーマリオ64の水中ステージの曲
  • アンリミテッド・サガのヴェントのテーマ
  • アンリミテッド・サガの砂漠ステージの曲
  • FF3のこだいびとのむらの曲

が弾けるようになった。ゲームタブ.net(参考4)で検索すると、メジャーなゲームであればだいたいタブ譜が見つかる。こだいびとのむらが一番かんたんで、水中ステージの曲が一番むずかしくて、ヴェントのテーマが指が疲れて、サガフロ2のテーマ曲が弾いていて一番楽しい。マザー2のウィンターズの曲と、ノーラと刻の工房の曲を最近覚え中。


参考4:
Game Tabs // Video Game Tablature