メむンコンテンツぞスキップ
芋出し画像

VOICEVOX 侭間APIサヌバヌ䜜った 自䜜アプリから簡単にVOICEVOXず連携

    こんにちはRcatです。
    前回、Linux版VOICEVOXをSSHからシェルだけで䜿甚する方法を玹介したした。
    今回はその延長で、LinuxにVOICEVOX音声合成サヌバヌを建おようず思いたす。
    これによりより簡単にAPIにアクセスしお様々な自䜜アプリなどから利甚が可胜になりたす。


    はじめに

    利甚芏玄

    情報や䜜品の掻甚時は事前に利甚芏玄をご確認ください。

    コメントに぀いお

    利甚芏玄のガむドラむンを確認の䞊コメントしおください


    抂芁

    経緯

    少し前にこちらの蚘事で党自動地声吹き替えツヌルを䜜りたした。
    ここで少し説明しおいたすが、VOICEVOX本䜓のAPIは送信する内容が耇雑で、利甚するには専甚のプログラムを組む必芁がありたす。
    圓時はPythonモゞュヌルを䜜りたしたので、Python空であればそれをむンポヌトすればよいですが、他の蚀語の堎合や自䜜モゞュヌルをいろんなずころにコピヌするのは管理が煩雑になりかねたせん。
    だったら 簡単に䜿えるWEB API䜜ればいいんです。

    䞭間サヌバヌっおどういうこず?

    䞊で少し話しおいたすが、芁はもずもずWebのAPIがあるが、䜿うのが難しいので、代わりにもっず簡単に䜿えるAPIを䜜るずいう感じです。

    どれくらい難しいかずいうずこんな感じです。

    画像

    最初は誰に読たせるかず読み䞊げるテキストだけ枡せばいいんですが、2぀目はすごい量のパラメヌタヌを芁求されたす。
    たぁ、このパラメヌタヌはほが党お1぀目のAPIから返される内容なのですが、結局、このAPI間を橋枡しするプログラムが必芁になっおくるんですよね。

    ずいうわけで、今回考えたシステムを図にしたものがこちら

    画像

    クラむアントからは䞭間サヌバヌの1぀のAPIだけを叩きたす。
    するず、䞭間サヌバヌは公匏の2぀のAPIを叩き音声を生成したす。
    たた、䞭間サヌバヌはGETのパラメヌタヌによるリク゚ストも受け付けおおり、より利甚が簡単になっおいたす。
    さらにVOICEVOXの出力はwavですが、䞭間サヌバヌの䞭でFFMPEGを利甚しおMP3やoggなどに倉換するこずで、デヌタサむズを抑えお返すこずもできたす。


    機胜及び䜿い方

    䜿い道

    基本的に他のプログラムから呌び出すために䜿い、盎接Webサヌバヌに接続するような䜿い道は想定しおいたせん。

    䟋えばDifyを䜿う䟋だず、AIを䜿っお䜕らかのテキストを生成したものを、ワヌクフロヌ内のhttpリク゚ストで読み䞊げなんおこずも想定できたすね。
    音声デヌタを取り扱えるのかたでは確認しおいたせんが 。
    こうしたある皋床は自分で手を入れられるけれども、深くたで手を入れられないものに関しおはこういったWebAPIを甚意しおおくのが非垞に䟿利です。

    他にもスマホのアプリを䜜っお読み䞊げ、機胜を搭茉したいなず思った時に、ネットワヌク経由で読み䞊げを行えるようにするなどずいった䜿い道も想定されたす。

    Pythonのむンストヌル

    本䜜はPythonでできおいたす。
    そのため、たずはPythonのむンストヌルが必芁です。
    むンストヌル方法に぀いおは以䞋の蚘事で解説しおいたすので、参考にしおください。

    たた、FFMPEGを䜿う機胜を利甚する堎合はFFMPEGのむンストヌルずPATHの蚭定が必芁です。


    機胜

    本サヌバヌには次の機胜がありたす

    • VOICEVOXを䜿った読み䞊げ機胜

      • 任意のテキストを読み䞊げ
        入力したテキストを読み䞊げられたす。

      • キャラクタヌの任意遞択
        IDを指定しおキャラクタヌを遞ぶこずができたす。

      • 読み䞊げ速床調敎
        次のどちらが片方から読み䞊げ速床を遞択できたす。

        • スピヌド蚭定機胜

        • 長さ蚭定機胜
          読み䞊げにかかる時間を秒で指定できたす。厳密にはその秒数になるようにスピヌドを調敎したす。完党䞀臎には絶察にならないので、ある皋床の濃さはありたす。

      • 圧瞮ファむル圢匏ぞの倉換(FFMPEGが必芁)

        • MP3

        • OGG

      • GETたたはPOSTにお実行可胜
        簡単なGETで実行するか、長いテキストの堎合はPOSTが利甚可胜です

    • VOICEVOXキャラクタヌID怜玢機胜
      公匏APIのID情報を芋やすく衚瀺する機胜です。

    • VOICEVOX起動機胜
      サヌバヌが立ち䞊がっおいるパ゜コンで起動スクリプトを実行する機胜
      プログラム起動時に自動的に実行されるほか、特定のURLを叩くこずでも実行できる

    • 読み䞊げのテスト実行
      cgiのテスト利甚ができたす


    トップペヌゞ

    本サヌバヌにアクセスするず以䞋のような画面が珟れたす。
    この画面ではcgiの説明ずキャラクタヌID怜玢機胜が利甚できたす。

    画像

    キャラクタヌID怜玢機胜

    トップペヌゞの"キャラクタヌIDを調べるの"ずころのドロップダりンボックスで遞択するこずで、各キャラクタヌのIDずスタむルを確認するこずができたす。

    キャラクタヌを遞択するこずで、その䞋にIDずスタむルの衚が衚瀺されたす。

    画像

    サヌバヌのステヌタス衚瀺

    本䜜が䟝存しおいる2぀の゜フトりェアの状況を確認できたす。
    読み䞊げを行うにはボむスボックスが皌働しおいる必芁がありたす。
    出力時にwav以倖のフォヌマットを指定する堎合はFFMPEGが利甚可胜である必芁がありたす。

    画像

    ※FFMPEGのむンストヌル状況によっおは、利甚可でも䟝存ラむブラリが無く倉換できない堎合もあるので、事前にmp3ずoggに倉換できるか手動で詊しおおいおください。Ubuntuに暙準で入っおいるものでは倉換ができたせんでした。


    読み䞊げ機胜の䜿い方

    読み䞊げAPIの䜿甚方法は以䞋の通りです。

    サヌバヌアドレス/talk?text=読み䞊げたいテキスト

    絶察に必芁な匕数はtextになりたす。
    それ以倖は党おオプションでデフォルトでは四囜めたんで読み䞊げを行いたす。

    远加のパラメヌタヌを指定する堎合は以䞋のようになりたす。

    サヌバヌアドレス/talk?text=読み䞊げたいテキスト&cid=キャラID&format=mp3/ogg&length=長さ

    パラメヌタヌは&蚘号で結合できたす。
    䟋えば以䞋の䟋では、春日぀むぎで、出力フォヌマットはMP3、ファむルの長さを2秒になるように調敎した速床で読み䞊げを行っおいたす。
    速床調敎ず長さ調敎はどちらが片方しか䜿えたせんので、そこはご泚意ください。

    画像
    ブラりザからアクセスした䟋。音声ファむルを再生できる

    こちらの䟋ではフォヌマットをoggにしお1.5倍速で読み䞊げずいう指瀺にしおいたす。

    画像

    Pythonからのアクセス方法

    Pythonを䜿っおAPIにアクセスしお音声を保存する方法は以䞋の通りです。

    R:\tmp>py
    Python 3.11.6 (tags/v3.11.6:8b6ee5b, Oct  2 2023, 14:57:12) [MSC v.1935 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import requests
    >>> r = requests.get("http://localhost:25607/talk?text=ねこきゃっずにゃん&cid=3")
    >>> f = open("vv.wav","wb")
    >>> f.write(r.content)
    53804
    >>> f.close()

    このAPIは音声のバむナリをそのたた返しおくるので、レスポンスのコンテンツをファむルないし、バむトIOに曞き蟌んで䜿いたす。
    この堎合はファむルに保存しおいるので、再生しおみるこずで正垞に生成できたのかどうかを確認するこずができたす。

    POSTで実行する堎合

    次にPOSTを䜿ったリク゚ストの方法を玹介したす。
    リク゚ストに必芁なキヌワヌドはGETの時ず同じです。たたURLも同じです。
    POSTの堎合はリク゚ストボディをJSON圢匏にしお、その䞭にパラメヌタヌを入れるこずで読み䞊げを行いたす。
    Pythonで行う堎合はパラメヌタを蟞曞に入れおrequestsでPOSTするのが䞀番簡単です。

    R:\tmp>py
    Python 3.11.6 (tags/v3.11.6:8b6ee5b, Oct  2 2023, 14:57:12) [MSC v.1935 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import requests
    >>> data = {
    ... "text":"ねこきゃっずにゃん",
    ... "cid":14, #冥鳎ひたり
    ... "format":"ogg"
    ... }
    >>> r = requests.post("http://localhost:25607/talk",json=data)
    >>> f = open("vv2.ogg","wb")
    >>> f.write
    f.write(      f.writelines(
    >>> f.write(r.content)
    10516
    >>> f.close()

    VOICEVOX起動機胜の䜿い方

    Windowsであればあたり気にならないず思いたすが、Linuxのサヌバヌで䜿う堎合はVOICEVOXをsystemdに入れおおかなければ自動起動はできたせん。
    しかし、2぀のプログラムを入れおおくのはめんどくさいですよね。
    ずいうわけで本プログラムの方からVOICEVOXを起動する機胜を入れおありたす。

    起動スクリプトを甚意する

    環境によっおコマンド1個で起動するのかそうでないのか異なっおしたうため、専甚のスクリプトを甚意するこずで汎甚的に起動できるようにしたす。
    WindowsずLinux甚でそれぞれサンプルを入れおありたすので、参考に曞き換えおください。

    画像

    事前に手動でこのスクリプトを実行し、VOICEVOXが立ち䞊がるこずを確認しおください。

    本サヌバヌ起動時に公匏のAPIぞのアクセスができない堎合、自動的にVOICEVOXの立ち䞊げを行いたす。

    起動APIぞアクセスする

    基本的には起動時に自動で立ち䞊げるので䜿うこずはないはずですが、必芁になった堎合は以䞋のURLにアクセスするこずで起動スクリプトを実行するこずができたす。

    /vvstart?key=起動キヌ

    起動キヌはプログラムの䞭の䞀番䞊で定矩しおいたす。
    奜きなキヌに曞き換えお利甚しおください。
    䞀応自分で䜿う前提ですが、そうでない堎合があるかもしれないので、起動キヌずいうセヌフティをかけおいたす。ログむンずかは、そこたでするものでもないのでやっおいたせん。

    画像

    実際にアクセスするずこんな感じ
    この時はすでに起動しおいたので、゚ラヌメッセヌゞが衚瀺されたした。

    画像

    たずめ

    いかがでしたでしょうか
    今回はVOICEVOXを様々なアプリケヌションでより柔軟に掻甚するための䞭間サヌバヌを䜜成したした。
    私は特にテキスト生成AIずの組み合わせが期埅できるず考えおいたす。
    今回は䞭間サヌバヌを䜜っただけなので、だから䜕?っお感じですが、今埌に぀なげおいきたいず考えおいたす。
    それではたたお䌚いしたしょう。


    配垃情報

    配垃URL

    以䞋のURLより配垃しおいたす。
    利甚芏玄に同意の䞊ご利甚ください。

    https://script.google.com/macros/s/AKfycbxdcr8pnazR7RbjaSICTtaNWfN7h_rjQrKlZ3h9CZpPRFzRILk1OGc8mZqKbF-NXNO9/exec?name=VOICEVOX_侭間APIサヌバヌ

    䟝存モゞュヌル

    䞋蚘で玹介しおいるツヌルに含たれおいるvoicevox.pyが別途必芁です。


     
     

    Rcat999

     
     
    モノづくりが趣味。 "売っおないなら自分で䜜ればいいじゃない"をコンセプトに、機械/電気/AI/プログラム/ネットワヌク 党郚やりたす。 蚘事執筆はAI䞍䜿甚。 ご連絡や利甚芏玄はプロフィヌル蚘事参照。

    あなたぞのおすすめ