背景
偉い先生と一緒に担当している科目がありまして、前半は偉い先生、そして後半は僕なんですが。
4、5週間後くらい始まるので少しずつ準備を進めています。
で、とある回のスライドで以下のようなものを作りました。
たまにありますよね?理系の本で、先生と生徒が会話しているわざとらしいやつ。あれです。作っているうちにLINEに似せようと変に懲りだして。。。
これ僕が読むんじゃなくて、機械に読ませたら面白いんじゃね?と思ったわけです。
まぁ、暇です。
macならsayコマンドで簡単に喋らせることができます。便利ですよねぇ。ほんと。
で、この適当なスクリプトファイルを作って1行ずつ読み込んではsayコマンドをsystemコマンドで実行すればいいんじゃね?と誰でも思いつきますね。
で、それをサクっとやってみたわけです。こんな感じです。10分もかかりません。
sayコマンドで会話させる。
— タカハシラボ (@ke_takahashi) 2020年6月5日
Kyoko:rubyって
Otoya:素敵だよね
if ARGV.size == 0
puts "Usage: ruby kaiwa.rb filename"
exit(0)
end
open ARGV[0], "r" do |file|
file.each do |line|
name, msg = line.split(':')
system("say -v #{name} #{msg}")
end
end#つぶやきRuby
なんか面白くなったので、どうせなら、ただしゃべるだけでなく音声ファイルにできたらあとでいろいろ利用できるよなぁ。。。って思ったんですね。
で、sayコマンドにoオプションがあるのでやってみたのですが、それだと1行ずつ音声ファイルができちゃうんですね。。。
たくさん生成された音声ファイルをあとで連結するコマンドがあれば、それをRubyで呼び出せばいけそうですね、と発想しました。
で、ぐぐった。
あった。
soxというコマンドです。偉い誰かさんが作ってくれたようです。超有名なffmpegでもできるんですがコマンドの指定方法が面倒なので却下しました。
以下のコマンドを叩くだけでインストールが完了します。これもmacのいいところです。
ちなみにsoxを知ったのは、このページでした。
stackoverflow.com
この段階のコードもすぐにつぶやきました。#つぶやきRubyってハッシュタグをつけました。これは「つぶやきProcessing」という活動を真似っ子しただけです。流行ってくれるといいな。。。と思うのです。最近のPythonブームで影が薄くなっていますから。。。Ruby界隈の偉い人が取り上げてくれたらなぁ。。。
exit(0) if ARGV.size==0
— タカハシラボ (@ke_takahashi) 2020年6月5日
open ARGV[0],"r" do |f|
s=[]
f.each do |l|
n,m=l.split(':')
system("say -v #{n} #{m.chomp} -o #{s.size}.aiff")
s << "#{s.size}.aiff"
end
system("sox #{s.join(' ') } #{ARGV[0]}.mp3")
system("rm #{s.join(' ')}")
end#つぶやきRuby
で、ついでだから、Githubにコード載せて、デモとして面白みがでるように、これまた有名なコーンフレーク漫才?のスクリプトをこちらのサイトからいただきました。
本題
で、完成したのが以下でーす。
会話文を書いたテキストファイルを引数で与えるとmp3に変換してくれます。
話者が単一のTTSはたくさんあると思いますが、会話させることを前提にしたアプリってあまりみたことがないように思います。意外と使えるんじゃないかな。。。って思います。
こんなことをやっているから貴重なやる気のある午前中がなくなっていきます。。。まぁ、いいですよね。余白は大事です。
では、また!