Upgrade to Pro — share decks privately, control downloads, hide ads and more …

音声合成してみよう

xztaityozx
February 25, 2023

 音声合成してみよう

第63回シェル芸勉強会のLTで使った資料です

xztaityozx

February 25, 2023
Tweet

More Decks by xztaityozx

Other Decks in Programming

Transcript

  1. 音声合成してみよう
    たいちょー

    View full-size slide

  2. みなさん#!/bin/bash(こんにちはの意)
    たいちょーです
    twitter: @xztaityozx_001
    GitHub: xztaityozx
    好きな言語: C#, Go
    職業: お嬢様系難読化シェル芸人

    View full-size slide

  3. 今回の話
    自分の音声で単純な音声合成をしてみる話

    View full-size slide

  4. 筋トレしてますか
    私はやってます
    めちゃくちゃ追い込む感じではなく、ゆるく自宅トレーニングしてます
    ちょっっっとだけ育ってきてちょっとうれしい
    これからも頑張ります
    でも…

    View full-size slide

  5. 回数数えるのが面倒

    View full-size slide

  6. 回数数えるのが面倒
    どの動きをN回、という感じ。回数を数えておく必要がある
    でも運動の方に集中したいので、回数が分からなくなりがち
    回数を電子音で知らせるアプリもあるけど、今何回目かがわかりにくくてむずい
    トレーナーがいれば楽ですが…家にはいない…!

    View full-size slide

  7. トレーナー作ればいい
    じゃん

    View full-size slide

  8. 音声合成を使ってトレーナーを作ろう
    音声合成
    テキストから音声を人工的に生成するやつ
    そんな感じのソフトウェアが割とある
    Open JTalk
    N2 TTS
    A.I VOICE
    まだまだたくさん
    回数を数える文章を書いて音声を合成すればトレーナーが作れる!

    View full-size slide

  9. 音声合成してみる
    今回はA.I VOICE 紲星あかりを使
    ってみます
    理由
    API用のDLLが配られて
    て、プログラムから音
    声を合成しやすい
    かわいい

    View full-size slide

  10. cute...
    いい感じですね
    APIを使って簡単にメニューを音声合成できるようにしたいですね!
    なんなら、WebサーバーにしてLAN内に公開したいですね!
    スマホから操作できてうれしいからですね!
    ちなみに、APIを使ったサーバーをインターネットに公開するのは規約で
    禁止されてます
    でも
    名前付きパイプを使う都合、.NET6ではできないですね
    とはいえ.NET FrameworkではWebサーバーを書くのがめんどくさいですね

    View full-size slide

  11. なんかこう…もっと手軽に合成したい…
    したいですね

    View full-size slide

  12. 自分の声合成すればい
    いじゃん
    そうかな…そうかも…

    View full-size slide

  13. 自分の音声合成ソフトを作ってみよう
    手法
    i. 50音を録音
    ii. 文字列を1文字ずつ分割
    iii. 対応する音声ファイルを ffmpeg で連結
    iv. 完成
    すごく簡単ですね!

    View full-size slide

  14. 録音
    以下のコマンドで生成した文字を一つずつ録音していきます
    echo {ァ..ン} | fmt -1 | grep -v '[ァ|ィ|ゥ|ェ|ォ|ヮ|ャ|ュ|ョ|ヰ|ヱ|ッ]'

    View full-size slide

  15. 分割
    Audacityの機能を使って録音ファイルをから一文字ずつ分割していきます。
    分割後のファイルはシェル芸で名前を付けておきます
    $ echo {あ..ん} | fmt -1 | grep -v '[ぁぃぅぇぉゃっゅょゎゑゐ]' | paste - <(ls) | rargs mv {2} {1}.mp3
    あ.mp3 , い.mp3 という感じのデータができます。

    View full-size slide

  16. 合成
    ffmpeg で音声を合成します。
    「こんにちは」だとすると、以下のコマンドで生成できます
    $ ffmpeg -i "concat:こ.mp3|ん.mp3|に.mp3|ち.mp3|は.mp3" out.mp3

    View full-size slide

  17. 聞いてみよう!

    View full-size slide

  18. こわい!
    そして全然かわいくない

    View full-size slide

  19. なぜ怖いのか
    いろいろあると思いますが、一番は抑揚がないからですね

    View full-size slide

  20. UniDicでアクセントを知らべてみる
    UniDic
    UniDicとは、国立国語研究所の規定した斉一(せいいつ)な言語単位(短単位)
    と、 階層的見出し構造に基づく電子化辞書の
    ① 設計方針
    および、その実装としてのリレーショナルデータベース
    ② UniDicデータベース
    と、そのデータベースからエクスポートされた短単位をエントリ(見出し語)と
    する、形態素解析器MeCab用の解析用辞書
    ③ 解析用UniDic
    の総称です。

    View full-size slide

  21. UniDicでアクセントを調べてみる
    25番目のフィールド(= aType )がアクセント位置です
    26,27番目のフィールドも使ってアクセントを修飾しますが、今回は単純化のため
    に位置だけを見ます
    こんにちは の場合は5文字目
    $ echo こんにちは | mecab -d /var/lib/mecab/dic/unidic
    こんにちは 感動詞,...省略...,コンニチハ,5,,,37963946107478528,138112
    EOS

    View full-size slide

  22. アクセント位置用の音声を用意する
    ピッチを調整した音声を用意します
    ffmpeg を使います
    1.01倍にします
    $ ls *.mp3 | rargs -p '(.+)\.mp3' ffmpeg -y -i {} -af 'asetrate=44100*101/100,atempo=100/101' {1}_accent.mp3

    View full-size slide

  23. アクセントを考慮した音声を合成してみる
    アクセントの効果をわかりやすくするために、ここでは「よろしくお願いいたしま
    す」を使います
    $ 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

    View full-size slide

  24. 聞いてみよう!

    View full-size slide

  25. こわい!!
    かなしいね

    View full-size slide

  26. 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=こんにちは

    View full-size slide

  27. まとめ
    1. 筋トレのトレーナーのかわりに音声合成を使おうと思った
    2. なんかもっとサッとやりたかったので、自分の音声を使った音声合成をやってみ

    3. こわかった
    4. アクセントをつけてみた
    5. こわかった
    App Runnerめちゃ簡単で良かったのでおススメです

    View full-size slide

  28. $ owari kan -g -a xztaityozx
    | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
    | 終 |
    | 制作・著作 |
    |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ |
    | xztaityozx |
    |_________|
    ∧∧ ||
    ( ゚д゚)||
    / づΦ

    View full-size slide