音声合成APIをPythonで操作して卑猥なAVタイトルを女声に読ませる

音声合成APIをPYTHONで操作して 女声に卑猥なAVタイトルを読み上げさせる

完全にネタですが、今回は 高品質な音声合成VoiceTextが簡単に使えるWebAPIを利用して、こちらの任意のテキスト(Avgle.comで取ってきた卑猥なAVタイトル)を読み上げさせるPythonのスクリプトを作ります。

VoiceTextとは?

20171009_VoiceTextとは I HOYA音声合成ソフトウェア VoiceText

HOYA Corporation様:スクリーンショット

VoiceTextは、様々な業界・企業・用途で1,300社以上に導入実績があり、電話自動応答、ロボット、アプリケーション、放送分野、Webなど、多様なシーン利用されている「人間の声に近い自然な音質の合成音声を提供する」HOYA株式会社様の法人向け製品です。

 

「アプリケーションタイプ」「組み込みタイプ」「サーバータイプ」「クラウドタイプ」など様々な製品ラインナップがありますが、今回はその中のクラウドタイプ「VoiceText Web API」を使ってみたいと思います。
ちなみにですがこちらの無料版音声合成APIの利用については以下のように商用利用及び二次利用禁止となっておりますので、ご了承ください。

無料版で作成した音声データの商用利用、二次利用及び配布する行為は禁止されております。 利用規約をご確認の上、本サービスをご利用ください。 有料版サービスを開始しました。詳しくは製品情報をご覧ください。
https://cloud.voicetext.jp/webapi

ちなみにですが製品版は、以下のような料金体験になっています。

プランスタンダード
基本料金/月80,000円/100,000リクエスト
最大文字数1,000文字
対応言語言語日本語・英語(アメリカ)・韓国語・中国語
ユーザー辞書機能詳しくはお問い合わせください
二次利用不可(※)

Web API | 製品情報 | HOYA音声合成ソフトウェア VoiceText

 

VoiceTextで任意のテキストを読み上げさせる

実行環境と必要なもの、及び簡単なディレクトリ構成を紹介します。

実行環境と必要なもの

MacOSで行なっていきます。windowsでもおそらく問題なく出来るかとは思います。

  • OS:Mac OSX Sierra 10.12.6
  • Python3.6.2
  • Requests 1.0.4
  • VoiceText Web APIキー

 

簡単なディレクトリ構成

app/ ・・・フォルダ名は何でも良きです。
├ output/ ・・・自動生成されます。
│ └ output.wav ・・・出力ファイル名は任意で決められます。
└ voicetext_api.py ・・・メインの実行ファイルです。名前は何でも良きです。

 

簡単な流れ

  1. ここからWeb APIキーを取得する。(※メールアドレス必須)
  2. スクリプトファイルを用意し、pythonで実行。
  3. ダウンロードされたwavファイルを音楽ソフトで再生

 

1.ここからWeb APIキーを取得する。(※メールアドレス必須)

https://cloud.voicetext.jp/webapi

HOYA株式会社様:スクリーンショット

ここから必要事項を入力し、返信メールにAPIキーが記載されているので控えます。

 

2.スクリプトファイルを用意し、pythonで実行。

ファイル名は何でも良いですが、例えばvoicetext_api.pyにしてあげて、pythonで実行すると「output」ディレクトリが作成され、「outout.wav」ファイルが作成されます。ファイル名は任意で変えることができますが、同じ名前のファイルがすでにある場合、上書きされます。

 

voicetext_api.py

'''
音声合成API(VoiceText)を使って卑猥なAVタイトルを女性に読み上げさせるPythonスクリプト
'''
import requests
from requests.auth import HTTPBasicAuth # requestsでBasic認証を行う
import json
import os

class VoiceTextApi(object):
    """
    テキストから音声データに変換するクラス
    """
    api_url = 'https://api.voicetext.jp/v1/tts'

    def __init__(self, api_key='', password='', speaker='hikari', text='', pitch=100):
        """
        インスタンスが生成されるときに自動的に呼び出されるメソッドのことをコンストラクタ
        :param api_key: 取得したAPI_KEY
        :param speaker: 話者名
        :param speaker: 合成するテキスト(200文字以内)
        """
        self._data = {
            'speaker': speaker,
            'text'   : text,
            'pitch'  : pitch
        }
        self._auth = HTTPBasicAuth(api_key, password)

    def output_wav(self, output='output.wav'):
        """
        テキストから音声データに変換するメソッド
        :param output: 出力ファイル名を指定する
        """
        res = requests.post(self.api_url, data=self._data, auth=self._auth)
        if res.status_code == requests.codes.ok:
            # リクエスト成功したらファイルに書き出し
            data = res.content
            output_dir = './output'
            output_path = output_dir + '/' + output
            # outputディレクトリにファイルを書き出す
            if not os.path.exists(output_dir):
                # outputディレクトリがなければ作成
                os.mkdir(output_dir)
            # wavファイルの書き出し
            with open(output_path, 'wb') as f:
                f.write(data)
        else:
            # リクエスト失敗した場合は例外発生
            res.raise_for_status()

    def get_emotion(self, emotion, level=1):
        """
        感情カテゴリを変更されます。
        :param emotion: 感情カテゴリ
        :param level: 感情の度合い(1~4)
        """
        if emotion in ['happiness', 'anger', 'sadness']:
            self._data['emotion'] = emotion
            if isinstance(level, int) and 1 <= level <= 2:
                self._data['emotion_level'] = level
        else:
            raise ValueError('不正な値です。')

        return self

def get_title_from_avgle_id(query):
    '''
    avgle.comで[query]で検索し該当した最初の動画のタイトルを返す
    :param query: タイトルや動画のIDなど
    '''
    page = 0
    limit = 1
    AVGLE_SEARCH_JAV_API_URL = 'https://api.avgle.com/v1/search/{}/{}?limit={}'.format(query, page, limit)
    res = requests.get(AVGLE_SEARCH_JAV_API_URL).json()
    if res['success']:
        # リクエスト成功したら、該当する最初の動画のタイトルを返す
        title = res['response']['videos'][0]['title']
        return title
    else:
        # リクエスト失敗した場合は例外発生
        raise ValueError('該当するタイトルがありませんでした。')

if __name__ == '__main__':

    # ここの値を好き勝手に変更してください。
    YOUR_API_KEY = 'ahrz2gucce804bf4'
    OUTPUT_NAME = 'output.wav'
    YOUR_TEXT = get_title_from_avgle_id('矢澤美々')

    vt = VoiceTextApi(api_key=YOUR_API_KEY, text=YOUR_TEXT, pitch=105)
    vt.output_wav(output=OUTPUT_NAME)

    # pitchを113くらいにして、speakerをshow君にすると、どこかで聞き覚えのある声になるとか、、、
    # vt = VoiceTextApi(api_key=YOUR_API_KEY, text=YOUR_TEXT, speaker='show', pitch=113)
    # vt.output_wav(output=OUTPUT_NAME)

    # 怒らせながら読み上げさせる
    # vt = VoiceTextApi(api_key=YOUR_API_KEY, text=YOUR_TEXT).get_emotion('anger', level=3)
    # vt.output_wav(output=OUTPUT_NAME)

70行目のYOUR_API_KEY = ‘XXXXXXXXXXXXXX’を、上記で取得したご自身のAPIキーに変更してください。
71行目のOUTPUT_NAME = ‘output.wav’を変更すると、出力されるファイル名が変更できます。
72行目のYOUR_TEXT = get_title_from_avgle_id(‘矢澤美々’)の「矢澤美々」の部分を変更すれば、avgle.comから別の動画タイトルが取得できます。

 

上記のファイルを用意したら、


python3 voicetext_api.py

or


python3 voicetext_api.py

を実行。
すると、音声ファイルがoutputディレクトリに作成されているはずです。

 

3.ダウンロードされたwavファイルを音楽ソフトで再生

outputディレクトリにwavファイルが保存されていると思うので、それを再生すれば音声が聞こえるはずです。

 

【特別編】話者を女性ではなく男性(show)に変えてピッチを上げると、モヤモヤさまぁ~ず2のショウ君になる

20171009_ショウ君コーナー I HOYA音声合成ソフトウェア VoiceText

HOYA Corporation様:スクリーンショット

http://voicetext.jp/show/index.html

テレビ東京で2007年から放映されている人気バラエティー「モヤモヤさまぁ~ず2」のナレーターとして、「VoiceText SHOW」が使われております。

 

悪用厳禁ですが、このショウ君に卑猥なAVタイトルを読み上げさせると、
そこはかとなくヤバみのある面白さになりますwww

スクリプトとしては、以下のような感じで、speakerとpitchを変えてあげれば良さげです。


vt = VoiceTextApi(api_key=YOUR_API_KEY, text=YOUR_TEXT, speaker='show', pitch=113)
vt.output_wav(output=OUTPUT_NAME) 

 

【特別編】感情カテゴリ(emotion)を指定し、怒らせながら卑猥なAVタイトルを読み上げさせる。

以下のようなメソッドをチェーンさせることで、感情を与えることができます。
今回は、「怒り」の感情を追加し、感情レベルを3に指定してあげました。


vt = VoiceTextApi(api_key=YOUR_API_KEY, text=YOUR_TEXT).get_emotion('anger', level=3)
vt.output_wav(output=OUTPUT_NAME)

すると、若干声が甲高くなるような感じで卑猥なAVタイトルを読み上げてくれるようになりました。
怒りながら読み上げさせるというシチュエーションだけでも十分高まりました。