第63回シェル芸勉強会のLTで使った資料です
音声合成してみようたいちょー
View Slide
みなさん#!/bin/bash(こんにちはの意)たいちょーですtwitter: @xztaityozx_001GitHub: xztaityozx好きな言語: C#, Go職業: お嬢様系難読化シェル芸人
今回の話自分の音声で単純な音声合成をしてみる話
筋トレしてますか私はやってますめちゃくちゃ追い込む感じではなく、ゆるく自宅トレーニングしてますちょっっっとだけ育ってきてちょっとうれしいこれからも頑張りますでも…
回数数えるのが面倒
回数数えるのが面倒どの動きをN回、という感じ。回数を数えておく必要があるでも運動の方に集中したいので、回数が分からなくなりがち回数を電子音で知らせるアプリもあるけど、今何回目かがわかりにくくてむずいトレーナーがいれば楽ですが…家にはいない…!
トレーナー作ればいいじゃん
音声合成を使ってトレーナーを作ろう音声合成テキストから音声を人工的に生成するやつそんな感じのソフトウェアが割とあるOpen JTalkN2 TTSA.I VOICEまだまだたくさん回数を数える文章を書いて音声を合成すればトレーナーが作れる!
音声合成してみる今回はA.I VOICE 紲星あかりを使ってみます理由API用のDLLが配られてて、プログラムから音声を合成しやすいかわいい
cute...いい感じですねAPIを使って簡単にメニューを音声合成できるようにしたいですね!なんなら、WebサーバーにしてLAN内に公開したいですね!スマホから操作できてうれしいからですね!ちなみに、APIを使ったサーバーをインターネットに公開するのは規約で禁止されてますでも名前付きパイプを使う都合、.NET6ではできないですねとはいえ.NET FrameworkではWebサーバーを書くのがめんどくさいですね
なんかこう…もっと手軽に合成したい…したいですね
自分の声合成すればいいじゃんそうかな…そうかも…
自分の音声合成ソフトを作ってみよう手法i. 50音を録音ii. 文字列を1文字ずつ分割iii. 対応する音声ファイルを ffmpeg で連結iv. 完成すごく簡単ですね!
録音以下のコマンドで生成した文字を一つずつ録音していきますecho {ァ..ン} | fmt -1 | grep -v '[ァ|ィ|ゥ|ェ|ォ|ヮ|ャ|ュ|ョ|ヰ|ヱ|ッ]'
分割Audacityの機能を使って録音ファイルをから一文字ずつ分割していきます。分割後のファイルはシェル芸で名前を付けておきます$ echo {あ..ん} | fmt -1 | grep -v '[ぁぃぅぇぉゃっゅょゎゑゐ]' | paste - <(ls) | rargs mv {2} {1}.mp3あ.mp3 , い.mp3 という感じのデータができます。
合成ffmpeg で音声を合成します。「こんにちは」だとすると、以下のコマンドで生成できます$ ffmpeg -i "concat:こ.mp3|ん.mp3|に.mp3|ち.mp3|は.mp3" out.mp3
聞いてみよう!
こわい!そして全然かわいくない
なぜ怖いのかいろいろあると思いますが、一番は抑揚がないからですね
UniDicでアクセントを知らべてみるUniDicUniDicとは、国立国語研究所の規定した斉一(せいいつ)な言語単位(短単位)と、 階層的見出し構造に基づく電子化辞書の① 設計方針および、その実装としてのリレーショナルデータベース② UniDicデータベースと、そのデータベースからエクスポートされた短単位をエントリ(見出し語)とする、形態素解析器MeCab用の解析用辞書③ 解析用UniDicの総称です。
UniDicでアクセントを調べてみる25番目のフィールド(= aType )がアクセント位置です26,27番目のフィールドも使ってアクセントを修飾しますが、今回は単純化のために位置だけを見ますこんにちは の場合は5文字目$ echo こんにちは | mecab -d /var/lib/mecab/dic/unidicこんにちは 感動詞,...省略...,コンニチハ,5,,,37963946107478528,138112EOS
アクセント位置用の音声を用意するピッチを調整した音声を用意しますffmpeg を使います1.01倍にします$ ls *.mp3 | rargs -p '(.+)\.mp3' ffmpeg -y -i {} -af 'asetrate=44100*101/100,atempo=100/101' {1}_accent.mp3
アクセントを考慮した音声を合成してみるアクセントの効果をわかりやすくするために、ここでは「よろしくお願いいたします」を使います$ ffmpeg -i concat:$(echo よろしくお願いいたします|\mecab -d /var/lib/mecab/dic/unidic | \awk 'NF>1{print $2}' | \sel -d, 21 25 | \awk '{for(i=1;i<=length($1);i++) if(i==$2) { print substr($1, i, 1)"_accent.mp3" } else print substr($1, i, 1)".mp3"}' | \paste -sd\|) \./output.mp3
こわい!!かなしいね
APIサーバーを建ててみました…いい感じにできたらWebサービスとして公開してみるかと思ってましたいい感じになってないですが公開しました。ただしAPIだけ…https://[サ終しました].ap-northeast-1.awsapprunner.com/api/Generate{"Text": "こんにちは"} といった感じのJSONをPOSTしてやると、音声ファイルへのURLが返ってきますAWS App Runnerの素振りがしたかったのがほとんどのモチベです今日中にサーバーは落とすので試すなら今!!# httpie の例$ http --json POST https://[サ終しました].ap-northeast-1.awsapprunner.com/api/Generate Text=こんにちは
まとめ1. 筋トレのトレーナーのかわりに音声合成を使おうと思った2. なんかもっとサッとやりたかったので、自分の音声を使った音声合成をやってみた3. こわかった4. アクセントをつけてみた5. こわかったApp Runnerめちゃ簡単で良かったのでおススメです
$ owari kan -g -a xztaityozx| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|| 終 || 制作・著作 ||  ̄ ̄ ̄ ̄ ̄ ̄ ̄ || xztaityozx ||_________|∧∧ ||( ゚д゚)||/ づΦ