Mac上のPython でDocomoの音声合成APIの音声データ(raw)をwavに保存する[AITalk]

以前の記事「docomoの音声合成APIの音声データ(Binary)をMacで再生する方法 (2つ) 」で試した Docomoの音声合成APIをMacのPythonからWavデータに保存できるようにしました。
(Windowsでは動きません)

目次

環境

  • Mac OS : 10.11.4 (EI Capitan)
  • Python 3.4.1

前準備

docomo Developer supportに登録して、音声合成のAPI_KEYを取得しておく

使い方

1. 以下のソースを保存

ファイル名は適当でもOK。
以下、sample.py で保存したとします。

API_KEYは適時修正してください。

# -*- coding:utf-8 -*-

"""
 Mac上で指定したテキストから、docomoの音声合成APIのバイナリデータをwavデータに保存する
"""

import os
import sys
import datetime
import argparse
import subprocess
import requests
import pprint


# config
# ===========================================

#バイナリデータの一時保存場所
tmp = "./cache/"

# wavデータの保存場所
soundDir = "./sound/"

#Docomo 音声合成 API
API_KEY = '***********************************************************************'
url = "https://api.apigw.smt.docomo.ne.jp/aiTalk/v1/textToSpeech?APIKEY="+API_KEY


# aitalk パラメーター設定
# ===========================================

"""
参考)音声合成 | docomo Developer support
https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_name=text_to_speech&p_name=api_1#tag01

    'speaker' : "nozomi"、"seiji"、"akari"、"anzu"、"hiroshi"、"kaho"、"koutarou"、"maki"、"nanako"、"osamu"、"sumire"
    'pitch' : ベースライン・ピッチ。 基準値:1.0、範囲:0.50~2.00
    'range' : ピッチ・レンジ。基準値:1.0、範囲:0.00~2.00
    'rate' : 読み上げる速度。基準値:1.0、範囲:0.50~4.00
    'volume' : 音量。基準値:1.0、範囲:0.00~2.00
"""

prm = {
    'speaker' : 'nozomi',
    'pitch' : '1',
    'range' : '1',
    'rate' : '1',
    'volume' : '1.5'
}

# パラメーター受取
# ===========================================
#%% arguments
parser = argparse.ArgumentParser()
parser.add_argument('--text',      type=str,   required=True)
args = parser.parse_args()
text = args.text


# SSML生成
# ===========================================
xml = u''
voice = ''
prosody = ''
xml += ''+ voice + prosody + text + ''

# utf-8にエンコード
xml = xml.encode("UTF-8")


# Docomo APIアクセス
# ===========================================
print("Start API")

response = requests.post(
    url,
    data=xml,
    headers={
        'Content-Type': 'application/ssml+xml',
        'Accept' : 'audio/L16',
        'Content-Length' : len(xml)
    }
)

#print(response)
#print(response.encoding)
#print(response.status_code)
#print(response.content)

if response.status_code != 200 :
    print("Error API : " + response.status_code)
    exit()

else :
    print("Success API")

#現在日時を取得
now = datetime.datetime.now()
tstr = datetime.datetime.strftime(now, '%Y%m%d-%H%M%S')

#保存するファイル名
rawFile = tstr + ".raw"
wavFile = tstr + ".wav"

#バイナリデータを保存
fp = open(tmp + rawFile, 'wb')
fp.write(response.content)
fp.close()

print("Save Binary Data : " + tmp + rawFile)


# バイナリデータ → wav に変換
# ===========================================

# macのsoxを使って raw→wavに変換
cmd = "sox -t raw -r 16k -e signed -b 16 -B -c 1 " + tmp + rawFile + " "+ soundDir + wavFile
# コマンドの実行
subprocess.check_output(cmd, shell=True)

print("Done : " +soundDir + wavFile)

2. 保存フォルダの準備

sample.pyを保存した同じディレクトリ内に、 “cache”,”sound”のディレクトリを作成
書き込み権限を与えておくこと

{作業フォルダ}
├ sample.py
├ cache/
└ sound/

3. 実行

ターミナルで以下コマンドを実行

$ cd {作業フォルダ}
$ sample.py --text 音声合成って楽しいですね

成功すれば、sound/*******.wav が保存され、再生できるはず
cache内のデータは削除してOK

パラメーターについて

合成音声の話者や読み上げ速度などはSSMLで調整可能となっています。

    'speaker' : "nozomi"、"seiji"、"akari"、"anzu"、"hiroshi"、"kaho"、"koutarou"、"maki"、"nanako"、"osamu"、"sumire"
    'pitch' : ベースライン・ピッチ。 基準値:1.0、範囲:0.50~2.00
    'range' : ピッチ・レンジ。基準値:1.0、範囲:0.00~2.00
    'rate' : 読み上げる速度。基準値:1.0、範囲:0.50~4.00
    'volume' : 音量。基準値:1.0、範囲:0.00~2.00

パラメーターはAITalkの音声合成デモンストレーション http://www.ai-j.jp/cloud/webapi/で試せます。

ただAPIではデモンストレーションの話者全員を使えないので気をつけること。
APIで使える話者は以下のみ

のぞみ、まき、すみれ、かほ、あかり、ななこ
せいじ、おさむ、ひろし、あんず、こうたろう

参考サイト)

  • URLをコピーしました!

この記事を書いた人

どうでもいいことばかりです

コメント

コメントする

目次