にじボイスAPIを試す

音声生成プラットフォーム「にじボイス」。そのAPIがリリースされました。

・APIなのでPC環境に依存しない(低スペックPCでも音声合成できる)
・新規アカウントに5,000文字無料でついてくる
というわけでAITuberに使ってみた。

Pythonを使って生成していく。
まずはにじボイスのAPIキーを取得。

Googleアカウントでログインし、APIキーのページを開く。
目のマークを押すと表示されるけど、絶対に他人に見せちゃいけないよ。

次にボイス一覧からキャラ(声)を探す。

右下のコピーマークをクリックするとコピーできるよ。

次はコードを書いていく。
私はAITuber本の影響をもろに受けているので以下のようにした。

nijivoice_adapter.py

import os
import requests
import sounddevice as sd
import soundfile as sf
from datetime import datetime
from dotenv import load_dotenv


class nijivoiceAdapter:
    def __init__(self) -> None:
        load_dotenv()
        self.api = os.environ.get('NIJIVOICE_API')
        self.id = os.environ.get('NIJIVOICE_ID')
        self.url = f"https://api.nijivoice.com/api/platform/v1/voice-actors/{self.id}/generate-voice"
        self.path = "C:/Users/nekuron/Desktop/mp3/"
    
    def play_voice(self, text):
        payload = {
            "format": "mp3",
            "speed": "1.0",
            "script": f"{text}"
        }
        headers = {
            "accept": "application/json",
            "x-api-key": f"{self.api}",
            "content-type": "application/json"
        }
        try:
            response = requests.post(self.url, json=payload, headers=headers)
            response.raise_for_status()  # HTTPエラーの確認
        except requests.exceptions.RequestException as e:
            print(f"Error occurred during POST request: {e}")
            return
        try:
            response_data = response.json()
            audio_file_url = response_data["generatedVoice"]["audioFileDownloadUrl"]
        except (KeyError, ValueError) as e:
            print(f"Error parsing response JSON: {e}")
            return
        try:
            audio_response = requests.get(audio_file_url)
            name = self.path + self.generate_filename()
            f = open(name,"wb")
            f.write(audio_response.content)
            f.close()
        except requests.exceptions.RequestException as e:
            print(f"Error occurred during GET request for audio file: {e}")
            return
        try:
            self.play_audio(name)
        except Exception as e:
            print(f"Error processing or playing audio: {e}")
    
    # 音声ファイルを読み込んで再生
    def play_audio(self, file_path):
        try:
            # 音声ファイルを読み込む
            data, samplerate = sf.read(file_path)
            # 再生
            sd.play(data, samplerate)
            # 再生終了まで待機
            sd.wait()
            print("再生が完了しました!")
        except Exception as e:
            print(f"エラーが発生しました: {e}")
    
    def generate_filename(self):
        # 現在の日時を取得
        now = datetime.now()
        # フォーマットを指定して文字列に変換
        filename = now.strftime("%Y%m%d%H%M%S") + ".mp3"
        return filename
            
if __name__ == '__main__':
    adapter = nijivoiceAdapter()
    adapter.play_voice("てすと")

まずAPIなどは環境変数として.envに記載している。

公開したらダメだぞ?絶対だぞ?

さてほかの人の記事にはない書き方をしている。
というのも謎に詰まって、試行錯誤、最終的にいったんmp3ファイルを保存することになったのだ。
・・・( ˘ω˘ )ほかの人は直接再生しているね

このコードで試す人がいるなら「self.path = "C:/Users/nekuron/Desktop/mp3/"」の部分のパスを自分の環境に合わせて変えてほしい。
ちなみにこれはデスクトップにmp3フォルダを作ってます。

ファイル名がかぶらないように時間でファイル名を決めている。
コードだと「generate_filename」関数だ。

使いたいときは「nijivoiceAdapter」の「play_voice」にテキストを渡すだけでいい。

この「nijivoiceAdapter」を組み込んだAITuberでテスト配信してみた。

この動画はN100という非力なマシンで配信できるかのテストだったのだが、需要あったのかな・・・

ちなみに話していた時間は5分未満だけど、1000クレジット使いました。
ちゃんとした雑談配信するなら課金必須だね。

タイトルとURLをコピーしました