3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

COTOHA音声合成を中の人が軽く解説

Last updated at Posted at 2020-03-30

#COTOHA音声合成を中の人が軽く解説
2019年10月31日にCOTOHA APIのラインナップの一つとして音声合成をリリースしました!!

そこで本記事では、音声認識の解説に引き続き実際に音声合成の中の人がpythonで音声合成APIを実行する方法を簡単に説明していきます!!

また、COTOHA API ポータルにてデモサイトを掲載しておりますので、実際に遊んでみてください!!

今回はテキストからの 音声合成 !!

これまでのCOTOHA君はテキストと音声を理解できましたが

音声合成がリリースされたことでCOTOHA君がなんと!!しゃべれるようになりました!!!

出力形式は

・一括音声合成
・逐次音声合成

の2パターンを提供しており、ユースケースに応じて利用可能です。

For Enterprise版の提供のみとなっていますが,3ヶ月のお試し期間があるためそちらを使ってお試しいただければと思います!!

音声合成の仕組み.png

#音声合成APIってどうなってるの??
音声合成 → テキストを入れたら音声が返ってくるっていうのは分かりました。

では,実際にテキストからどのように音声を生成しているのかをさらっと解説します。

##音声合成APIの構成イメージ図
音声合成API構成図.png

COTOHA 音声合成APIは上記のような構成をしています。

1.テキスト解析

入力されたテキストを解析し、読みやアクセント位置などを決定する部分。
これを行うことで、正しい読み方やアクセントを実現しています。

2.音声信号生成

テキスト解析結果をもとに声の高さやスピードなどを決定し、音声信号を生成する部分。
ここで、流暢で人間らしい肉声感のある音声を実現しています。

#音声合成APIの主な特長
##16種類の豊富な話者!

16話者.png

16種類の話者を提供しており、ユースケースにあった話者を見つけられます。

詳細はコチラをご確認ください!

##文脈に応じて読み分けられる!

日本語は1つの表記で複数の読み方を持つ言葉があり、文脈等によって読み方が変わることがあります。

ただ、そういった言葉を以下の例文のように読み分けることができます!

表記 例文1 例文2
辛い スパイスが入っていて、このカレーは辛い(カライ) この日までに資料を提出するのは辛い(ツライ)
羽生 対局室に羽生(ハブ)九段がいます スケートリンクに羽生(ハニュウ)選手がいます
空いている お腹が空いている(スイテイル) あそこの席が空いている(アイテイル)

##音声の読み上げ方を調整可能!
生成される音声はユースケースに応じて、話す速さ音量声の高さ抑揚を自在に調整することができます。

また、ここでは詳しく書きませんが、デフォルトでは正しく読み上げない単語や文章も単語辞書API文辞書APIを利用することで正しく読み上げるようになります。

#音声合成APIの使い方解説
それでは,どのように音声合成APIを使えば良いのかを,pythonサンプルコードを使って簡単に解説していきます!
ちなみに、サンプルコードはGithubに公開しているので、そちらを参考にしてください。

・Githubサンプル
java
Node.js
python
javascript

・リクエストボディ

Source Code | クリックしてください
{
    "text": "辛いスパイスを食べるのは辛い",
    "speakerId": "ja_JP-M-S0001-T001-E01-SR0",
    "textType": "normal",
    "speechRate": "1.0",
    "powerRate": "2.0",
    "intonation": 10,
    "pitch": 10
}

各パラメータを任意に設定して[jsonファイル]として保存してください。

キー名 説明 特記
text 読ませたい文章 textTypeがnormalなら500文字まで,utteranceなら1200文字まで
speakerId 話者 話者IDから好みの話者を選択
textType テキストの種別 対象テキストの種別を指定 (normal もしくは utterance)
speechRate 音声の話速 値域:0.50~2.00 刻み幅:0.01 値が大きいほど速い
powerRate 音声の音量 値域:0.00~5.00 刻み幅:0.01 値が大きいほど大きい
intonation 音声の抑揚 値域:1~20 刻み幅:1 値が大きいほど大きい
pitch 音声の高低 値域:1~20 刻み幅:1 値が大きいほど高い

・アクセストークン取得&一括音声合成

Source Code | クリックしてください
#coding:utf-8

import sys
import json
import urllib.request

# 認証情報定義
clientId = 'xxxxxxxxxxxxxxxxxxxxxxxx'
clientSecret = 'yyyyyyyyyyyy'

# 接続先定義
oauthUrl = 'https://api.ce-cotoha.com/v1/oauth/accesstokens'
ttsUrl = 'https://api.ce-cotoha.com/api/tts/v1/tts'

# main の処理
# コマンドライン引数1 : 音声合成設定を記入したjsonファイル
# コマンドライン引数2(option) : 出力wavファイル名
# 出力 : 合成音声wavファイル
def main():
    accessToken = getToken(oauthUrl, clientId, clientSecret)
    argv = sys.argv
    if len(argv) <= 1:
        print('usage: python sample_py [input_json_file] [(option)output_wav_file]')
        exit(1)
    inputFilePath = argv[1]
    if len(argv) > 2:
        outputFilePath = argv[2]
    else:
        outputFilePath = 'output.wav'
    postData = inputFromFile(inputFilePath)
    audioData = postAndRecieve(ttsUrl, accessToken, postData)
    outputToFile(audioData,outputFilePath)
    
# アクセストークン取得
def getToken(postUrl, cId, cSecret):
    data = {}
    data['grantType'] = 'client_credentials'
    data['c![undefined]()
lientId'] = cId
    data['clientSecret'] = cSecret
    jsonData = json.dumps(data).encode('utf-8')
    
    http = urllib.request.Request(postUrl)
    http.add_header('Content-Type', 'application/json; charset=UTF-8')
    http.add_header('Content-Length', len(jsonData))

    try:
        with urllib.request.urlopen(http, jsonData) as response:
            responseData = response.read()
            responseJson = json.loads(responseData.decode('utf-8'))
            print('getToken completed successfully.')
            return responseJson['access_token']
    except urllib.error.HTTPError as err:
        errData = err.read()
        errJson = json.loads(errData.decode('utf-8'))
        print('[ERROR!(@getToken)] status: ' + str(errJson['status']) + ', message: ' + errJson['message'])
        exit(1)

# JSON ファイルの読み込み
def inputFromFile(inputFilePath):
    jsonFile = open(inputFilePath, 'r',encoding='utf-8')
    jsonData = json.load(jsonFile)
    print('inputFromFile completed successfully.')
    print('post data: ' + str(jsonData))
    return json.dumps(jsonData).encode('utf-8')

# データをポストし合成音声を取得
def postAndRecieve(postUrl, token, postData):
    http = urllib.request.Request(postUrl)
    http.add_header('Authorization', 'Bearer '+token)
    http.add_header('Accept', 'Audio/wav')
    http.add_header('Content-Length', len(postData))
    http.add_header('Content-Type', 'application/json; charset=UTF-8')

    try:
        with urllib.request.urlopen(http, postData) as response:
            responseData = response.read()
            print('postAndRecieve completed successfully.')
            return responseData
    except urllib.error.HTTPError as err:
        errData = err.read()
        errJson = json.loads(errData.decode('utf-8'))
        print('[ERROR!(@post_and_recieve)] status: ' + str(err.code) + ', code: ' + errJson['code'] + ', detail: ' + errJson['detail'])
        exit(1)

# 音声ファイルを出力
def outputToFile(data, outputFilePath):
    outputFile = open(outputFilePath, 'wb')
    outputFile.write(data)
    outputFile.close
    print('outputToFile completed successfully.')
    print(outputFilePath + ' has been generated.')

main() 
  

上記を[pythonファイル]として保存してください。
[pythonファイル]と[jsonファイル]は同じフォルダに置いて、ターミナルで
python [pythonファイル] [jsonファイル] [(任意)音声ファイルを保存するときの名前]を実行してください。
[(任意)音声ファイルを保存するときの名前]がない場合はoutput.wavとして、実行したディレクトリに保存されます

・返ってきた音声ファイルをすぐに再生したいときは・・・

Source Code | クリックしてください
#coding:utf-8

#2つのライブラリを追加
from pydub import AudioSegment
from pydub.playback import play

def main():
    ・・・
    ・・・
    Audio_playback(outputFilePath) #main() の一番下に追加


# 音声ファイルの再生 適当な場所に追加
def Audio_playback(outputFilePath):   
    sound = AudioSegment.from_file(outputFilePath, "wav")
    print('Audio playback now.')
    play(sound)
    print('Finish.')

[pythonファイル]にライブラリの追加とmain()関数に1行追加し、適当な場所に音声ファイル再生の関数を追記してください。音声ファイルの保存後、自動で音声再生されます。

#まとめ
COTOHA音声合成の紹介でした。
音声合成は色んな文章を色んな声で実際に人が話しているように聞こえるので、面白いですね!

最後に、たくさんの文字を一括音声合成で処理すると返ってくるまで時間がかかることがあるので、
そんなときは逐次音声合成を試してみてください。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?