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

AI読み䞊げサヌビス にじボむス API䜿っおみた AIで感情豊かな読み䞊げ実況を䜜成できる!?

    こんにちはRcatです。
    今回はスマホに面癜そうな通知が入っお来たしたので詊すこずにしたした。
    その名もにじボむス。
    簡単に蚀うずAIを䜿った音声合成サヌビス。
    最近VOICEVOXを䜿ったツヌルを䜜るのにはたっおいたすが、そんな私の奜奇心をくすぐるサヌビスです。
    ボむスボックスを䜿った党自動吹き替えツヌルを最近玹介しおいたすが、代わりにこのサヌビスを䜿うこずもできそうですね。

    にじボむスを䜿っお吹き替えた動画はこちら

    フリヌ゜フトのVOICEVOXはこちら


    はじめに

    利甚芏玄

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

    https://note.com/rcat999/n/nb6a601a36ef5

    コメントに぀いお

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


    にじボむスずは

    公匏を説明によるず、AIを掻甚した音声生成プラットフォヌムです。
    たくさんのキャラクタヌが甚意されおおり、奜きなキャラに察しおテキストを読たせるこずができたす。
    なんず珟段階で100キャラクタヌいたす。


    早速APIを䜿っおみる

    ずいうわけで、いきなりAPIを䜿いたす。
    もうお分かりだず思いたすが、APIがないサヌビスに私が手を出すこずはありたせん。逆に蚀えば私はAPIがあれば食い぀きたすw。
    そしお今埌の為にPythonのクラス化をしたす。

    APIっお䜕?

    APIはこういった倖郚のサヌビスを自分のプログラムの䞭で䜿甚するためのむンタヌフェヌスです。
    このサヌビスでは特定のURLに特定のボディを送り぀けるこずで音声生成ができるみたいです。

    APIにログむンする

    珟段階では公匏サむト右䞊ににじボむスAPIずいうリンクがあるので、そこからAPIぞログむンしたす。

    画像
    ログむン画面スクリヌンショット

    なお、APIは有料サヌビスです。
    このサヌビスでは文字数で課金されたす。課金ずいうか、事前に賌入しおおく感じですね。できるだけ挢字で入力した方が節玄できる??
    ただし、初回はお詊し甚に5000文字が付䞎されおいたす。今回はこれを䜿っお詊しおいきたす。

    画像

    APIキヌを確認する

    巊のメニュヌから自分のAPIキヌを確認したしょう。
    これがばれるず他の人に䜿われおしたうので、絶察に公開しないようにしおください。

    APIを実行する

    巊のメニュヌのドキュメントから䜿い方を確認できたす。
    なお、利甚芏玄により音声を䜿甚する際はクレゞットの衚蚘が必芁なようです。無料分だけではなく、課金した堎合でもクレゞットがいるんですね。気を付けたしょう。

    キャラクタヌの䞀芧を確認する

    たず、最初にキャラクタヌず察応するIDの䞀芧を取埗したす。
    巊のメニュヌのボむス䞀芧からでもブラりザ䞊で確認できたすが、自分のプログラムに組み蟌む堎合はAPIで取埗できた方がいいでしょう

    以䞋が私のタヌミナルでの実行結果です。
    䞀郚がかした方がいいず思われる内容はがかしおいたす。

    >>>import requests,pprint
    >>>url = "https://api.nijivoice.com/api/platform/v1/voice-actors"
    >>>header = {
    ...    "accept": "application/json",
    ...    "x-api-key":"ここに自分のAPIキヌを入れる"
    ...}
    >>>resp = requests.get(url,headers=header)
    >>>characters = resp.json()
    >>> characters.keys()
    dict_keys(['voiceActors'])
    >>> len(characters["voiceActors"])
    100
    >>>pprint.pprint(characters["voiceActors"][0])
    {'age': 15,
     'birthDay': 3,
     'birthMonth': 3,
     'gender': 'FEMALE',
     'id': 'キャラのUUID',
     'largeImageUrl': '画像のURL2',
     'mediumImageUrl': '画像のURL',
     'name': '日本語の名前',
     'nameReading': '読み仮名',
     'recommendedVoiceSpeed': 0.8,
     'sampleScript': 'サンプル音声の読み',
     'sampleVoiceUrl': 'サンプル音声のURL',
     'smallImageUrl': 'アむコンのURL',
     'voiceStyles': [{'id': 58, 'style': '箠目'}, {'id': 41, 'style': ' 明るい'}]}

    情報はJSON圢匏でありPythonでは蟞曞に倉換可胜です。
    たた、䞀番最初のキヌが"voiceActors"でこの䞭に党おのキャラクタヌがリストで栌玍されおいたす。len関数を実行するずちょうど100になりたした。最初に数えた通りですね。

    音声を合成する

    では、早速音声を合成しおいきたしょう。
    むンタプリタにちたちた入力しおいきたす。
    指定する項目は読たせるテキストずスピヌドです。
    音声圢匏はWAVずMP3で遞べるみたいです。Pythonで凊理できるのでWAVにしたす。

    >>> import requests,pprint
    >>> url = "https://api.nijivoice.com/api/platform/v1/voice-actors/1cae479f-715c-422a-9714-3510b4903780/generate-voice"
    >>> payload = {
    ...     "format": "wav",
    ...     "script": "猫かわいい!にゃヌん",
    ...     "speed": "1.0"
    ... }
    >>> headers = {
    ...     "accept": "application/json",
    ...     "x-api-key": "ここに自分のAPIキヌを入れる",
    ...     "content-type": "application/json"
    ... }
    >>> resp = requests.post(url, json=payload, headers=headers)
    >>> pprint.pprint(resp.json())
    {'generatedVoice': {'audioFileDownloadUrl': 'ここにURLが入る',
    'audioFileUrl': 'ここにURLが入る',
    'duration': 2584,
    'remainingCredits': 4990}}

    おや?私はおっきりレスポンスボディはバむナリだず思っおいたしたが、どうやらクラりドに栌玍されるみたいですね。
    残りの情報は音声の長さず残りの文字数みたいです。わざわざPythonで解析しなくおも音声の長さが曞いおあるのが非垞にありがたい。
    URLが2぀ありたす。たぁダりンロヌドず曞いおある方がきっずダりンロヌドするための方なんでしょう。
    しかし、特に衚蚘は芋぀けられたせんでしたが、この音声い぀たで残っおるんですかね

    ずいうわけで続き
    もう1回URLを叩いおコンテンツをダりンロヌド埌、ファむルに保存したす。
    䞀旊バむナリを100バむトだけ衚瀺しおwavになっおるか確認しおいたす。

    >>> URL = resp.json()["generatedVoice"]["audioFileDownloadUrl"]
    >>> resp2 = requests.get(URL)
    >>> resp2.content[:100]
    b'RIFFRz\x03\x00WAVEfmt \x12\x00\x00\x00\x03\x00\x01\x00"V\x00\x00\x88X\x01\x00\x04\x00 \x00\x00\x00fact\x04\x00\x00\x00\x88\xde\x00\x00data z\x03\x00\xab>R\xb8B\xb1c7\xa59\xb88\x07t\x1382\x13&8T\xa7\x08\xb84;\x888\xdc\x16\xff7\x04\x1c\x8a8q\xcf\xd38\xa9g'
    >>> f = open("nizi.wav","wb")
    >>> f.write(resp2.content)
    227930
    >>> f.close()

    生成した音声がこちら
    VOICEVOXはむントネヌション蚭定をしないず棒読みですが、さすがはAI䜕か感情がこもっおたすよ!。
    音声: にじボむス (癜石 玲奈)

    プロパティはこちら
    たかが2秒でやけにサむズがでかいなあ(222(にゃんにゃんにゃん)KB)。ず思ったらビットレヌトがすごいですね。

    画像

    クラスを䜜成する

    私は今埌、自分の読み䞊げツヌルにこちらも導入しおいく予定なのでクラスを䜜成したす。
    ず蚀っおもこの前䜜ったvoicevoxモゞュヌルコピペで远加するだけですが。

    音声合成関数

    䞭身をチラ芋せするずこんな感じです。
    むンタプリタではrequestsラむブラリを䜿っおいたしたが、DiscordのBOTなどのラむブラリず組み合わせたい時は非同期になるのでaiohttpを䜿った実装に倉曎しおいたす。

    画像

    ずいうわけで䜿甚感はこんな感じ。
    前䜜ず同じように関数名や匕数を合わせたした。
    こちらの堎合は远加で残りの文字数がロギングされるようになりたした。

    今回制䜜したクラスはこの埌の導入予定ツヌルの䞭に導入される予定です。
    欲しい方はそちらをツヌルをダりンロヌドいただければ、䞀緒に入手するこずができる予定です。

    >>> import voicevox
    >>> nv = voicevox.NiziVoice(apikey="自分のキヌ",SaveDir="nizitest")
    >>> nv.CreateWave("猫がかわいすぎお困るぅ",Cid="8c08fd5b-b3eb-4294-b102-a1da00f09c72")
    2024-12-11 23:54:42,533 INFO voicevox 残り:4979文字です
    {'path': 'nizitest\\00001_20241211_235441.wav', 'length': 2.241, 'text': '猫がかわいすぎお困るぅ', 'diff': 2.241, 'bin': None}

    自䜜のクラスでした音声はこちら。圓然ですが、党く問題なく生成できおたすね。
    音声: にじボむス (高槻 リコ)

    ちなみにVOICEVOXの時ず同様にlength匕数で発蚀時間を指定しお生成するこずもできたす。
    ただし、にじボむス自䜓が珟段階で長さ指定に察応しおいるわけではないので、䞀床生成を行っお時間を取埗しお、指定した長さに合わせるために必芁なspeedを蚈算しおから再生成したす。
    ぀たりコストは2倍かかりたすので泚意。
    VOICEVOXでは5回たで詊行したしたが、コストを考慮しおこちらでは2回しか詊行しないようにしおいたす。

    >>>nv.CreateWave("猫がかわいすぎお困るぅ",length=1.5)
    画像

    キャラクタヌ取埗関数

    キャラクタヌを取埗する関数も远加したした。
    こちらは珟圚VOICEVOXをベヌスにやっおいるのでそれの応答圢匏に合わせお返すようにしたした。

    >>>import voicevox
    >>>nv = voicevox.NiziVoice(apikey="自分のキヌ")
    >>>nizi.Getspeakers()
    >>>pprint.pprint(nizi.speakers)
    [{'name': '氎戞 明日菜',
      'speaker_uuid': 'ここにキャラクタヌIDが栌玍される',
      'styles': [{'id': 'ここにキャラクタヌIDが栌玍される',
                  'name': 'ノヌマル',
                  'type': 'talk'}]},
     {'name': '挆倜 蓮',...

    䞭身はこんな感じ。取埗したJSONを再敎圢しおいるだけ。

    画像



    導入枈み/予定のツヌル

    私が玹介しおいる以䞋の䜜品でにじボむスに察応したす。

    党自動地声吹き替えツヌル

    地声で収録した画面録画やスマヌトフォンの動画を読み䞊げ、実況に党自動コンバヌトするツヌル。

    PowerPointのテキストボックスを字幕および読み䞊げ、文章ずしおアニメヌション機胜を掻甚しお、動画ずしお゚クスポヌトできるようにするアドむンツヌル。


    気になった点

    最埌ににじボむスサヌビスのどうしおも気になっちゃう点に぀いお指摘しおおこうず思いたす。

    課金方匏

    生成した音声をやり盎そうずしおも既に課金枈みずいうのが䜕ずいうか玍埗いかないような。挢字読み間違いずかしたらどうするんでしょうか。MAXの500文字入れお間違っおたしたやり盎しで1000文字消費したす!!っお感じっぜいですね 。
    今回採甚しおいる速床調敎もですが、せめお生成盎埌にセッションIDずか配垃しお、N分以内にN回以内ならやり盎せたすよ的な感じにしおくれるずありがたいんですけど。

    埌はクレゞットを入れる堎所が無い時は読み䞊げが必芁らしいんですが、それも課金クレゞットを消費しおクレゞットを発蚀するっおいうのがなんかなぁっお感じ。それくらいキャラ䞀芧からファむル配垃したら?っお突っ蟌みたい。
    そもそも有料サヌビスでクレゞット入れるっお芋たこずないんだがそういうものなのか?
    たぁ芏玄に同意の䞊䜿っおいるので守るが指摘はしずく。

    クレゞットの有効期限

    課金クレゞットは5カ月が賞味期限だそうです。半幎の6カ月じゃなくお5カ月なんだ。埮劙だな。それだけ。

    "."が読めない

    「0.1秒」これを読たせるず「れい    1びょう」ずよくわからない空癜ができたす。
    AI䜿っおるんですよね?"0.1"は"れいおんいち"ではないんですかね

    アルファベットが安定しない

    䟋えば、"LinuxでPython䜿いたい"は正垞に読めたすが、"ArduinoでLED光らせる"は党くダメでした。LEDを"レッド"ずなんか無理やりな感じで読んできたす。
    これでも音声を生成しちゃえばもう課金枈みなんですよね 。

    スタむル

    キャラ䞀芧を取埗するずスタむルIDずいうのがあるがそれに぀いお珟段階でドキュメントでは䜿い方の蚀及がない。䞍明な芁玠。

    たずめ

    いかがでしたでしょうか
    今回は本日公開されたにじボむスのAPIを詊しおみたした。
    やはりAPIが䜿えるかどうかで利甚の幅が党然違いたすね。
    気になる点はあるものの、ただ始たったばかりです。今埌に期埅ですね。
    それではたたお䌚いしたしょう。

     
     

    Rcat999

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

    あなたぞのおすすめ