{
    "componentChunkName": "component---src-templates-blog-post-jsx",
    "path": "/post/voiceloid-like-text2speech/",
    "result": {"data":{"site":{"siteMetadata":{"title":"WEB EGG","author":"Leko - CTO at Yuimedi"}},"markdownRemark":{"id":"b3f291d5-da54-5b30-bd37-d48dc95641fe","excerpt":"こんにちは。 とある案件で docomo の音声合成 API を利用することが合ったのですが、 エーアイ版の API のデモを試していたら「これゆかりんの声やんけ！ と思ったら葵ちゃんもいる！」とテンションが上ってしまいました。 本来VOICEROID は有償（それも安くはないお値段）なのに、docomo の API…","html":"<p>こんにちは。<br>\nとある案件で docomo の音声合成 API を利用することが合ったのですが、<br>\nエーアイ版の API のデモを試していたら「これゆかりんの声やんけ！ と思ったら葵ちゃんもいる！」とテンションが上ってしまいました。<br>\n本来<strong>VOICEROID は有償（それも安くはないお値段）なのに、docomo の API を介せば無料</strong>で使えるというワクワク感。</p>\n<p>もはや仕事なんてしている場合じゃない、理解を深めなければ。ということで試してみました。</p>\n<!--more-->\n<h2 id=\"まえおき\" style=\"position:relative;\"><a href=\"#%E3%81%BE%E3%81%88%E3%81%8A%E3%81%8D\" aria-label=\"まえおき permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>まえおき</h2>\n<p>ボイロの話題に興味が湧いて来てくださった方が多いと信じて、ボイロ自体の説明は割愛します。<br>\nボイロ自体の知識は持っているという前提で記事を書いています。あらかじめご了承下さい。</p>\n<p>また、試して見た限りではすべてのボイロが扱えるわけではなく、</p>\n<ul>\n<li>結月ゆかり</li>\n<li>弦巻マキ</li>\n<li>月読アイ</li>\n</ul>\n<p>の３名が使えることを確認できました。<br>\n残念ながら docomo の API だけでは全ボイロは試せませんでした。<br>\n特にエーアイ版 API を提供してらっしゃる<a href=\"http://www.ai-j.jp/demonstration/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">AITalk のデモ版</a>には葵ちゃんの声があるので、API で使えないのが残念です。<br>\nとても悔やまれますが、使いたければ買えという話なので仕方ない。</p>\n<h3 id=\"利用規約を確認してみる\" style=\"position:relative;\"><a href=\"#%E5%88%A9%E7%94%A8%E8%A6%8F%E7%B4%84%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B\" aria-label=\"利用規約を確認してみる permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>利用規約を確認してみる</h3>\n<p><a href=\"https://dev.smt.docomo.ne.jp/?p=docs.api.page&#x26;api_name=text_to_speech&#x26;p_name=guideline#tag01\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ガイドライン</a>を確認してみると、</p>\n<ul>\n<li>本 API を用いたアプリケーションは無償で提供すること</li>\n<li>本 API を用いたアプリケーション内で広告収入を含む収益行為をしないこと</li>\n</ul>\n<p>の２つが条件で利用して良いとのことなので、売り物作るわけではないし実験する分には大丈夫だろうという判断です。</p>\n<h2 id=\"作ったもの\" style=\"position:relative;\"><a href=\"#%E4%BD%9C%E3%81%A3%E3%81%9F%E3%82%82%E3%81%AE\" aria-label=\"作ったもの permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>作ったもの</h2>\n<h3 id=\"題材\" style=\"position:relative;\"><a href=\"#%E9%A1%8C%E6%9D%90\" aria-label=\"題材 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>題材</h3>\n<p>今回の記事でお借りする台詞は、<br>\n個人的に好きな<a href=\"https://www.nicovideo.jp/watch/sm30193805\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">豚野郎さんの sm30193805</a>の”ここテン”をお借りしました。</p>\n<iframe width=\"312\" height=\"230\" src=\"https://ext.nicovideo.jp/thumb/sm30193805\" scrolling=\"no\" style=\"border:solid 1px #ccc;\" frameborder=\"0\"><a href=\"https://www.nicovideo.jp/watch/sm30193805\">[Watch Dogs 2] 　ゆかりさんハッキングする [VOICEROID+ゆっくり実況]</a></iframe>\n<p>今回作る台本・プリセットで音声化したものが以下の音声ファイルです</p>\n<audio src=\"/89a464db61e9d798bb35c5ad198e6d16/voiceloid-like-text2speech.wav\" preload=\"auto\" controls>\n<h3 id=\"デモ\" style=\"position:relative;\"><a href=\"#%E3%83%87%E3%83%A2\" aria-label=\"デモ permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>デモ</h3>\n<p>とりあえず３名の声は使えるとわかったので、それら３役でかけあいができるような簡単なスクリプトを書きました。<br>\n<a href=\"https://gist.github.com/Leko/937b97724def8de90b8fe97a3bfb639c\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">こちら</a>に公開しています。<br>\nREADME 通りにセットアップを済ませ、</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token punctuation\">.</span><span class=\"token operator\">/</span>playbook<span class=\"token operator\">-</span>to<span class=\"token operator\">-</span>voices 台本<span class=\"token punctuation\">.</span>csv <span class=\"token operator\">-</span>p 台本preset<span class=\"token punctuation\">.</span>csv <span class=\"token operator\">-</span>o <span class=\"token punctuation\">.</span><span class=\"token operator\">/</span>音声<span class=\"token punctuation\">.</span>wav</code></pre></div>\n<p>と実行すると、CSV で書いた台本が音声ファイル（.wav）として入手できます。</p>\n<h2 id=\"下準備\" style=\"position:relative;\"><a href=\"#%E4%B8%8B%E6%BA%96%E5%82%99\" aria-label=\"下準備 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>下準備</h2>\n<p>API を利用するためにやや学習コストが発生します。各要素軽くだけ触れておきます。</p>\n<h3 id=\"利用する-api\" style=\"position:relative;\"><a href=\"#%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B-api\" aria-label=\"利用する api permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>利用する API</h3>\n<p>すでに名前が出てきていますが、利用する API は docomo Developer API の<a href=\"https://dev.smt.docomo.ne.jp/?p=docs.api.page&#x26;api_name=text_to_speech&#x26;p_name=api_1#tag01\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">音声合成 API エーアイ REST SSML 版</a>です。<br>\n他の API も試してみたのですが、ボイロの声ではなかったので、この記事では上記 API だけを利用します。</p>\n<h3 id=\"docomo-developer-に登録して-api-キーを入手\" style=\"position:relative;\"><a href=\"#docomo-developer-%E3%81%AB%E7%99%BB%E9%8C%B2%E3%81%97%E3%81%A6-api-%E3%82%AD%E3%83%BC%E3%82%92%E5%85%A5%E6%89%8B\" aria-label=\"docomo developer に登録して api キーを入手 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>docomo developer に登録して API キーを入手</h3>\n<p>docomoAPI を使うためには API キーが必要です。<br>\n会員登録とアプリケーションの利用申請を出して、API キーを入手しておいて下さい。</p>\n<h3 id=\"ssml-とはなんぞや\" style=\"position:relative;\"><a href=\"#ssml-%E3%81%A8%E3%81%AF%E3%81%AA%E3%82%93%E3%81%9E%E3%82%84\" aria-label=\"ssml とはなんぞや permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>SSML とはなんぞや</h3>\n<p>さらっと SSML 版と書きましたが、SSML とは<a href=\"https://www.w3.org/TR/speech-synthesis11/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Speech Synthesis Markup Language</a>の略です。<br>\n音声合成のためのマークアップ言語です。<br>\n微妙にフォーマットが違いますが、Amazon Echo などでも使用されている仕様だそうです。</p>\n<blockquote>\n<p>— <a href=\"http://qiita.com/sparkgene/items/cf4ca976dbf09b45971d\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Amazon Echo で「バルス」を実現する - Qiita</a></p>\n</blockquote>\n<p>詳しくは API を叩くときに解説しますが、<br>\n声の種類や話す内容だけではなく、<strong>よみがな（ルビ）やイントネーションも操作できる</strong>パワフルな言語です。<br>\nおそらく作り込めばかなり表現力は増すのですが、イントネーション周りは制御がかなり難しかったです。<br>\nマークアップさえ与えればその通りに喋った音声が手に入るので、音声自体の扱いは大して気にすることはありません。</p>\n<h3 id=\"台本を作る\" style=\"position:relative;\"><a href=\"#%E5%8F%B0%E6%9C%AC%E3%82%92%E4%BD%9C%E3%82%8B\" aria-label=\"台本を作る permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>台本を作る</h3>\n<p>とはいえ、最近素の HTML で愚直なマークアップする機会もなかなか減っていると思います。XML ベースの言語って冗長で面倒くさいですし。<br>\nということで、Excel や Google Spreadsheet などで編集することを想定に、<strong>CSV の「台本」を受け取って SSML に変換して音声化</strong>してみます。<br>\n台本のフォーマットはこんな感じです。</p>\n<iframe width=\"658\" height=\"400\" class=\"full-width\" src=\"https://docs.google.com/spreadsheets/d/e/2PACX-1vQK-kMNHZuTHF55cC2JWa-NyUmlOlFyqLtFPVjTEXykkyQNutvg_OQfgq1kDl0zEyz7vbu8Pk1m9sYh/pubhtml?gid=0&amp;single=true&amp;widget=true&amp;headers=false\"></iframe>\n<p>「１列目はボイス名、２列目は調声プリセット（デフォは空）、３列目は喋る内容」という構成にしました。</p>\n<p><strong>すでに嫌な予感 MAX</strong>な記述が出てきていますが、<strong>字幕と喋っている音声が違う</strong>箇所と、「弦巻マキ」の発音がおかしくて<strong>イントネーションを弄った</strong>結果です。<br>\nデフォルトだと「小比類巻」みたいな山なりの発音になってしまうので、ツルマキの部分を「うずまき」的な発音に寄せた調声です。<br>\n詳しくはマキマキのところで後述します。</p>\n<p>ボイロ動画を作るなら、背景やら字幕タイミング、立ち絵プリセットだったり差分プリセットだったりと色々必要になってしまうと思うのですが、今回はシンプルに<strong>音声のみ</strong>に絞って実装します。</p>\n<h3 id=\"プリセットを作る\" style=\"position:relative;\"><a href=\"#%E3%83%97%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88%E3%82%92%E4%BD%9C%E3%82%8B\" aria-label=\"プリセットを作る permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>プリセットを作る</h3>\n<p>調声がかなり難しかったので、デフォ値にこだわらずに調声のプリセットも与えられるようにして、利用者側で細かく調声できるようにします。<br>\n調声用のプリセットは以下の通りです</p>\n<iframe width=\"658\" height=\"230\" class=\"full-width\" src=\"https://docs.google.com/spreadsheets/d/e/2PACX-1vQK-kMNHZuTHF55cC2JWa-NyUmlOlFyqLtFPVjTEXykkyQNutvg_OQfgq1kDl0zEyz7vbu8Pk1m9sYh/pubhtml?gid=2080442496&amp;single=true&amp;widget=true&amp;headers=false\"></iframe>\n<p>キャラ名、プリセット名、喋るスピード、ピッチ、抑揚、ボリューム　の順です。<br>\n空の場合はデフォ値を使います。<br>\nプリセット名が空の場合は、プリセットなし（デフォルト）の調声を変更します</p>\n<h2 id=\"voiceroid-っぽい声を生成する\" style=\"position:relative;\"><a href=\"#voiceroid-%E3%81%A3%E3%81%BD%E3%81%84%E5%A3%B0%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B\" aria-label=\"voiceroid っぽい声を生成する permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>VOICEROID っぽい声を生成する</h2>\n<p>では早速 API を利用したいと思います。</p>\n<h3 id=\"台本を-ssml-に変換\" style=\"position:relative;\"><a href=\"#%E5%8F%B0%E6%9C%AC%E3%82%92-ssml-%E3%81%AB%E5%A4%89%E6%8F%9B\" aria-label=\"台本を ssml に変換 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>台本を SSML に変換</h3>\n<p>先程の台本を今回利用する API に合わせた SSML に変換すると、このようになります。<br>\n実際には改行されてませんが、見にくいのでインデントを整えたのが以下の SSML です。</p>\n<div class=\"gatsby-highlight\" data-language=\"xml\"><pre class=\"language-xml\"><code class=\"language-xml\"><span class=\"token prolog\">&lt;?xml version=\"1.0\" encoding=\"utf-8\" ?></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>speak</span> <span class=\"token attr-name\">version</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>1.1<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>voice</span> <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>sumire<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>prosody</span> <span class=\"token attr-name\">rate</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>1.4<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">pitch</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>1.2<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>皆さんこんにちは、結月ゆかりです<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>prosody</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>voice</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>voice</span> <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>maki<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>prosody</span> <span class=\"token attr-name\">rate</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>1.2<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>phoneme</span> <span class=\"token attr-name\">ph</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>ツル’／マ’キ<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>弦巻<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>phoneme</span><span class=\"token punctuation\">></span></span>マキです\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>prosody</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>voice</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>voice</span> <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>reina<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>prosody</span> <span class=\"token attr-name\">rate</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>1<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>ゆっくり霊夢です<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>prosody</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>voice</span><span class=\"token punctuation\">></span></span>\n\n    ...略...\n\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>speak</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>長いので省略しました。<br>\nお察しの通りさほど複雑ではないので、SSML を生成するロジック自体は<a href=\"https://gist.github.com/Leko/937b97724def8de90b8fe97a3bfb639c#file-playbook-to-voices\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">gist</a>の方を見ていただければと思います。<br>\n記事では SSML で使うタグの説明にとどめます。<br>\nボイロ化に最低限必要なのは、これらのタグでした。</p>\n<table>\n<thead>\n<tr>\n<th>タグ名</th>\n<th>説明</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>speak</td>\n<td>ルート要素。<code>version=\"1.1\"</code>が必要</td>\n</tr>\n<tr>\n<td>voice</td>\n<td>声の種類を指定する。指定可能な値は後述</td>\n</tr>\n<tr>\n<td>prosody</td>\n<td>日本語だと<a href=\"https://ja.wikipedia.org/wiki/%E9%9F%BB%E5%BE%8B_(%E8%A8%80%E8%AA%9E%E5%AD%A6)\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">韻律</a>というそう。ピッチや抑揚、スピードを制御できるので調声するために必須</td>\n</tr>\n<tr>\n<td>phoneme</td>\n<td>日本語だと<a href=\"https://ja.wikipedia.org/wiki/%E9%9F%B3%E7%B4%A0\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">音素</a>というそう。その言葉に対する発音の仕方を定義できます。イントネーションを変えたい場合に使用可能</td>\n</tr>\n</tbody>\n</table>\n<p><code>voice</code>の name 属性に与えられる値のうち、ボイロ製品に該当するのは</p>\n<table>\n<thead>\n<tr>\n<th>属性名</th>\n<th>ボイロ名</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>sumire</td>\n<td>結月ゆかり</td>\n</tr>\n<tr>\n<td>maki</td>\n<td>弦巻マキ</td>\n</tr>\n<tr>\n<td>anzu</td>\n<td>月詠アイ</td>\n</tr>\n</tbody>\n</table>\n<p>です。<br>\nデフォルトだと速度やピッチにやや違和感があるので、調声が必要です。</p>\n<p>大まかな調声に使う<code>prosody</code>に指定できる属性は、</p>\n<ul>\n<li><code>pitch</code>（ピッチ）</li>\n<li><code>rate</code>（喋る速度）</li>\n<li><code>range</code>（抑揚）</li>\n<li><code>volume</code>（音量）</li>\n</ul>\n<p>です。<br>\nこれらを調整するだけでかなりそれっぽくなります。詳しくは<a href=\"https://dev.smt.docomo.ne.jp/?p=docs.api.page&#x26;api_name=text_to_speech&#x26;p_name=api_1#tag01\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">公式の API ドキュメント</a>を読んで下さい。</p>\n<p><code>phoneme</code>の ph 属性には<a href=\"http://www.jeita.or.jp/cgi-bin/standard/pdf.cgi?jk_n=1408&#x26;jk_pdf_file=20110307080703_8FnXHkG4Y0.pdf&#x27;\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">JEITA カナ</a>という仕様にもとづいた値が指定可能です。<br>\nこれが<strong>めちゃくちゃ難しい</strong>。何が難しいかって、ドキュメントを読み解くのに一苦労で、なおかつ pdf に書かれている仕様が 100％はカバーされていないようで、何が使えて何が使えないのかがわからない。<br>\n完全に手探りで、欲しいイントネーションを探り当てる必要があるので、よほど気になる発音でない限りは触れないほうが無難だと思います。</p>\n<h3 id=\"音声合成-api-を叩く\" style=\"position:relative;\"><a href=\"#%E9%9F%B3%E5%A3%B0%E5%90%88%E6%88%90-api-%E3%82%92%E5%8F%A9%E3%81%8F\" aria-label=\"音声合成 api を叩く permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>音声合成 API を叩く</h3>\n<p>SSML が作れたら、API を叩きます。\nAPI を叩くのは、よくある POST リクエストです。詳細は<a href=\"https://dev.smt.docomo.ne.jp/?p=docs.api.page&#x26;api_name=text_to_speech&#x26;p_name=api_1#tag01\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">公式の API ドキュメント</a>に記載があります。<br>\nリクエストボディには先程生成した SSML を与えます。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> querystring <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'querystring'</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> fetch <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'isomorphic-fetch'</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">textToSpeech</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">async</span> <span class=\"token parameter\">ssml</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token constant\">ENDPOINT</span> <span class=\"token operator\">=</span> <span class=\"token string\">'https://api.apigw.smt.docomo.ne.jp/aiTalk/v1/textToSpeech'</span>\n  <span class=\"token keyword\">const</span> query <span class=\"token operator\">=</span> querystring<span class=\"token punctuation\">.</span><span class=\"token function\">stringify</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    <span class=\"token constant\">APIKEY</span><span class=\"token operator\">:</span> process<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">DOCOMO_API_KEY</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span><span class=\"token constant\">ENDPOINT</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">?</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>query<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n    method<span class=\"token operator\">:</span> <span class=\"token string\">'POST'</span><span class=\"token punctuation\">,</span>\n    body<span class=\"token operator\">:</span> ssml<span class=\"token punctuation\">,</span>\n    headers<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token string\">'Content-Type'</span><span class=\"token operator\">:</span> <span class=\"token string\">'application/ssml+xml'</span><span class=\"token punctuation\">,</span>\n      Accept<span class=\"token operator\">:</span> <span class=\"token string\">'audio/L16'</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Content-Type は SSML なので良いとして、Accept の<code>audio/L16</code>ってなんでしょう。<br>\n音声フォーマットなのですが、これが音声に詳しくない人（私）にとっては曲者だったので説明します</p>\n<h3 id=\"audiol16pcm-音源を-wav-形式に変換する\" style=\"position:relative;\"><a href=\"#audiol16pcm-%E9%9F%B3%E6%BA%90%E3%82%92-wav-%E5%BD%A2%E5%BC%8F%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B\" aria-label=\"audiol16pcm 音源を wav 形式に変換する permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>audio/l16(PCM 音源)を wav 形式に変換する</h3>\n<p>audio/l16（以降 PCM）というのは、16bit のリニア PCM と呼ばれる音声ファイルの形式です。</p>\n<p>pcm 単体では扱いにくいので、ffmpeg で.wav に変換してしまいましょう。<br>\n幸い pcm のメタデータ詳細は<a href=\"https://dev.smt.docomo.ne.jp/?p=docs.api.page&#x26;api_name=text_to_speech&#x26;p_name=api_1#tag01\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">公式の API ドキュメント</a>に記載されているので、ちゃちゃっと変換してしまいます。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> fs <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'fs'</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> Promise <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'bluebird'</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> ffmpeg <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'fluent-ffmpeg'</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">const</span> unlink <span class=\"token operator\">=</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">promisify</span><span class=\"token punctuation\">(</span>fs<span class=\"token punctuation\">.</span>unlink<span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">toWav</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">async</span> <span class=\"token parameter\">pcmPath</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> destPath <span class=\"token operator\">=</span> pcmPath <span class=\"token operator\">+</span> <span class=\"token string\">'.wav'</span>\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve<span class=\"token punctuation\">,</span> reject</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">ffmpeg</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">.</span><span class=\"token function\">input</span><span class=\"token punctuation\">(</span>pcmPath<span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">.</span><span class=\"token function\">inputOptions</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token string\">'-ac 1'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'-ar 16000'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">.</span><span class=\"token function\">inputFormat</span><span class=\"token punctuation\">(</span><span class=\"token string\">'s16be'</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">.</span><span class=\"token function\">output</span><span class=\"token punctuation\">(</span>destPath<span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">.</span><span class=\"token function\">on</span><span class=\"token punctuation\">(</span><span class=\"token string\">'end'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n        console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>destPath<span class=\"token punctuation\">)</span>\n        <span class=\"token function\">unlink</span><span class=\"token punctuation\">(</span>pcmPath<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span>resolve<span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">.</span><span class=\"token function\">on</span><span class=\"token punctuation\">(</span><span class=\"token string\">'error'</span><span class=\"token punctuation\">,</span> reject<span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">.</span><span class=\"token function\">run</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>PCM ファイルについての説明や、変換処理については別途記事を書いてますので、そちらもあわせてご確認下さい。</p>\n<blockquote>\n<p>— <a href=\"https://blog.leko.jp/post/how-to-convert-pcm-to-wav-with-ffmpeg/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ffmpeg で PCM 音源を WAVE 形式に変換するときにハマったこと | WEB EGG</a></p>\n</blockquote>\n<h2 id=\"まとめ\" style=\"position:relative;\"><a href=\"#%E3%81%BE%E3%81%A8%E3%82%81\" aria-label=\"まとめ permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>まとめ</h2>\n<p>以上が主要な処理の内容になります。各処理の詳細は<a href=\"https://gist.github.com/Leko/937b97724def8de90b8fe97a3bfb639c\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">gist</a>をご確認下さい。<br>\n機能の制限が厳しく、製品版のボイロには遠く及びませんでしたが、“それっぽい音声”までは迫れたかなと思います。<br>\n色々試しがいがありそうなので、今後もちょこちょこ触ってみようと思います。</p>\n<p>以降の内容は、各ボイロごとの SSML のおさらいとハマリポイントを記載します。</p>\n<h3 id=\"結月ゆかりボイスを試してみる\" style=\"position:relative;\"><a href=\"#%E7%B5%90%E6%9C%88%E3%82%86%E3%81%8B%E3%82%8A%E3%83%9C%E3%82%A4%E3%82%B9%E3%82%92%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B\" aria-label=\"結月ゆかりボイスを試してみる permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>結月ゆかりボイスを試してみる</h3>\n<p>再掲ですが、ゆかりんのボイスを SSML に起こすとこのような感じになります。<br>\n豚野郎さんの調整に合わせるには、ピッチ（<code>pitch</code>）と喋る速度（<code>rate</code>）を少し上げるとちょうどよい感じになりました。</p>\n<div class=\"gatsby-highlight\" data-language=\"xml\"><pre class=\"language-xml\"><code class=\"language-xml\">    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>voice</span> <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>sumire<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>prosody</span> <span class=\"token attr-name\">rate</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>1.4<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">pitch</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>1.2<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>皆さんこんにちは、結月ゆかりです<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>prosody</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>voice</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<h3 id=\"弦巻マキボイスを試してみる\" style=\"position:relative;\"><a href=\"#%E5%BC%A6%E5%B7%BB%E3%83%9E%E3%82%AD%E3%83%9C%E3%82%A4%E3%82%B9%E3%82%92%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B\" aria-label=\"弦巻マキボイスを試してみる permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>弦巻マキボイスを試してみる</h3>\n<p>自分の名前の発音だけ曲者でしたが、それ以外は結構いい感じでした。<br>\nマキマキも豚野郎さんの調整に合わせるなら速度を少し上げるといい感じでした。</p>\n<div class=\"gatsby-highlight\" data-language=\"xml\"><pre class=\"language-xml\"><code class=\"language-xml\">    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>voice</span> <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>maki<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>prosody</span> <span class=\"token attr-name\">rate</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>1.4<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>phoneme</span> <span class=\"token attr-name\">ph</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>ツル’／マ’キ<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>弦巻<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>phoneme</span><span class=\"token punctuation\">></span></span>マキです\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>prosody</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>voice</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<h3 id=\"月読アイボイスを試してみる\" style=\"position:relative;\"><a href=\"#%E6%9C%88%E8%AA%AD%E3%82%A2%E3%82%A4%E3%83%9C%E3%82%A4%E3%82%B9%E3%82%92%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B\" aria-label=\"月読アイボイスを試してみる permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>月読アイボイスを試してみる</h3>\n<p>ゆっくり霊夢（Softalk）は Web API がなかったので、代わりにアイちゃんに喋ってもらいました。<br>\nこれは似せるもなにもないので、適当に合わせています。<br>\nアイちゃんは声自体の癖が強めなので、どう調声してもだいたいアイちゃんに聞こえると思います。</p>\n<div class=\"gatsby-highlight\" data-language=\"xml\"><pre class=\"language-xml\"><code class=\"language-xml\">    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>voice</span> <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>reina<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>prosody</span> <span class=\"token attr-name\">rate</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>1.4<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>ゆっくり霊夢です<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>prosody</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>voice</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<h2 id=\"さいごに\" style=\"position:relative;\"><a href=\"#%E3%81%95%E3%81%84%E3%81%94%E3%81%AB\" aria-label=\"さいごに permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>さいごに</h2>\n<div class=\"gatsby-highlight\" data-language=\"csv\"><pre class=\"language-csv\"><code class=\"language-csv\"><span class=\"token value\">voice</span><span class=\"token punctuation\">,</span><span class=\"token value\">preset</span><span class=\"token punctuation\">,</span><span class=\"token value\">text</span>\n<span class=\"token value\">弦巻マキ</span><span class=\"token punctuation\">,</span><span class=\"token value\">ｾﾔﾅｰ</span><span class=\"token punctuation\">,</span><span class=\"token value\">グレートエレキファイア</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"csv\"><pre class=\"language-csv\"><code class=\"language-csv\"><span class=\"token value\">voice</span><span class=\"token punctuation\">,</span><span class=\"token value\">name</span><span class=\"token punctuation\">,</span><span class=\"token value\">rate</span><span class=\"token punctuation\">,</span><span class=\"token value\">pitch</span><span class=\"token punctuation\">,</span><span class=\"token value\">range</span><span class=\"token punctuation\">,</span><span class=\"token value\">volume</span>\n<span class=\"token value\">弦巻マキ</span><span class=\"token punctuation\">,</span><span class=\"token value\">ｾﾔﾅｰ</span><span class=\"token punctuation\">,</span><span class=\"token value\">0.5</span><span class=\"token punctuation\">,</span><span class=\"token value\">2.0</span><span class=\"token punctuation\">,</span><span class=\"token value\">2.0</span><span class=\"token punctuation\">,</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">./playbook-to-voices グレートエレキファイア.csv -p グレートエレキファイア_preset.csv -o ./talk.wav</code></pre></div>\n<audio src=\"/fb68dee6244962f174ffce8953d6a524/voiceloid-like-text2speech-great-elechi-fire.wav\" preload=\"auto\" controls>\n<p>ｾﾔﾅｰしたかった</p>\n<hr>\n<p>アイキャッチ画像に使用した立ち絵はこちらからお借りしました。</p>\n<blockquote>\n<p>— <a href=\"http://seiga.nicovideo.jp/seiga/im5449281\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">結月ゆかり 動画用素材 / 柚子胡椒 さんのイラスト - ニコニコ静画 (イラスト)</a></p>\n</blockquote>\n<blockquote>\n<p>— <a href=\"http://seiga.nicovideo.jp/seiga/im5517795\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">弦巻マキ 動画用素材 / 柚子胡椒 さんのイラスト - ニコニコ静画 (イラスト)</a></p>\n</blockquote>","timeToRead":15,"frontmatter":{"title":"docomoの音声合成APIを利用して無料でVOICEROIDっぽい声を生成してみる","tags":["Nodejs","音声合成","ffmpeg"],"date":"August 08, 2017","featuredImage":{"childImageSharp":{"fluid":{"tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='148'%20viewBox='0%200%20400%20148'%20preserveAspectRatio='none'%3e%3cpath%20d='M28%202c-4%206-3%2013%202%2017l3%201-6%206c-9%208-12%2016-11%2031v20c2%2012-4%2027-12%2034-2%202-4%204-4%206s0%202%203%201l10-7%206-4c-2%205-9%2014-14%2017-5%204-6%206-3%205v1l-2%203h1c2-2%203-1%203%207l1%208%201-8c0-9%201-11%209-24%2010-14%2011-25%205-39-4-10-4-30%201-39%204-8%2011-15%2020-20%207-3%2012-4%205-1-13%207-18%2017-19%2035%200%208-1%2012-2%2015-3%205%203%2019%209%2021v4l-2%205%203-4%204-5c3%201%203%201-1-4-8-12-11-33-6-45%203-7%208-14%2012-14l4-2c6-5%2027-9%2037-6%209%203%2019%2014%2024%2027%204%209%203%2026%200%2047l-3%2016-1-7c-1-11-2-9-2%204v12l1%202c1%203%203%204%202%201l1-1c1%201%201%201%201-1v-1c2%200%202%200%201-3-2-6%201-32%203-26%202%204%203%204%205%204%204%200%205-2%203-4l-2-2-2-6c-3-5-3-6-2-12%201-22-9-42-27-51-8-4-9-4-19-5H58l2-4c0-2%202-4%203-5l1-2-3%202h-2V0l-2%204-1%204-5-4-6-4c-2%200-2%200-1%201h-1c-9-1-14-1-15%201m4%203c-1%203-1%205%201%2010l2%204%204-2%2010-4%205-2-3-2c-8-6-17-8-19-4m296%2011c-7%202-14%207-18%2011s-7%204-7%200l1-5c2-4%200-4-2%200-4%207-4%2010-2%2012s2%202%200%205l-3%203-1%203c-1%204-4%2018-6%2020-1%203%200%204%202%201l3-2-1%203-2%203c0%202%200%202%201%201%202-2%202-2%202%201%201%205-4%2011-7%208-2-1-4%200-3%201l-3%207c-1%204-2%205-3%204s-1-1-2%201c-1%204%200%204%202%202%201-2%202-2%202-1l1%201c1-1%203%204%203%205-1%202%200%207%203%209%202%202%201%2010-1%2011v1c2%200%201%204-1%207l-3%201-3-1c-3%200-3%201-3%205%200%201-1%203-3%203l-5%205-4%202-1-1-3%201c-1%200%200%203%203%204h3c0-2%2011-12%2012-12l4-3c3-3%204-3%204-1l3-12%202-10c0-1%200-2-2-2-6-1-2-8%206-10%209-3%2020%200%2017%204-1%201-1%201-3-1-5-3-17%200-18%205%200%202%200%202%203%200l3-1%203%203c5%205%206%2016%203%2027%200%202%200%202%201%201%202-3%202-24%201-29-1-4%201-4%206%200%205%206%204%2017-4%2031-5%208-4%209%201%201%203-5%204-6%204-4l-2%2012c-1%202%200%202%2011%202h13v-8c0-7-2-7-2%200%200%203%200%203-2%203l-2-1-2-3c0-3%200-3-1-1%200%205-7%204-7-1%200-2%203-7%205-8%203-2%204-2%204%200h1c3-3%207-2%206%202%200%202%200%202%202-2%203-6%203-8%202-8h-3c-1-1-1-1%202-2l3-1v-1l1-1%203-2c1-3%203-4%206-5%206-1%205-1%203%205-4%2011-2%2022%206%2031%203%203%203%203%2011%203s8%200%208-3c1-1%200-2-1-3v-15c-1-3-1-3%201-3s7%205%2015%2015l6%207v-26l-7-2c-8-2-16-6-18-10l-3-4-2-1%202-2%203-2%205%205c5%204%205%204%205%200%201-9%201-9%202-8h2l6%202%205%202v-2l-1-4-3-4c-1-2-1-2%201-2%205%202%203-1-2-3l-5-1%201%201%206%2012c-2%200-10-7-10-9%200-5-2%203-3%2010v7l-5-5c-6-6-7-10-2-14%202-3%203-5%200-3h-1l1-3h2l1%201-1-3v-3l1-2%201%202%202%203v-2c-2-2-3-8-2-18%201-13%200-17-7-22-3-3-5-4-5-3%201%202%200%203-1%204l-2%204-1%203c-5-2-7%205-3%209%202%203%208%204%208%202l1-1%201%204v5l1-4c1-2%202-3%204-3s2%200%202%206l-2%2013-1%208-1%201c-1%200-3%208-2%2012%200%204-2%205-7%202-3-1-3-2-1-3v-1c-2%201-2%201-2-5l1-6-2%206-1%207h-6c-5%200-5%200-4-2l2-4%201-2c0-1-2%200-3%202l-4%205-2%203c-1%201-1%201%201%201%2011-3%2021-1%2022%204v3l-2-3c-3-3-6-4-12-4-6%201-16%205-16%207l-1%201-1-1v-1h-1l-8-4-10-4c-4-3-5-3-5-2h-1c-4-2-14-1-20%202l-4%202-2-4c-4-4-2-8%207-13l5-5c0-1%201-1%202%201%201%201%201%201%200%200l-3-16c0-3%200-4-1-3-3%204%201-10%204-16%209-18%2034-32%2047-26%202%201%203%202%204%201%207-4%2029%2010%2035%2022%203%206%207%2015%207%2019l7%2023c2%203%201-2-1-9-2-8-2-8%200-8%203%201%203-1%200-4-2-2-6-8-6-11l2-1c2%200%204-2%204-4s-2-3-2%200c-2%203-5%201-9-5-7-13-22-23-35-24-16-2-18-2-24%200m-11%2022c-2%203-3%204-1%204l1%208-1%209c-2%200-1%2013%201%2014l1-6v-6l2%203%202%201h1l-1-4-1-10c1-8-1-6-2%202v6l-1-5c-1-5-1-10%201-16%202-4%201-5-2%200M85%2041c0%206-2%2015-5%2017l-1%203c0%201-4%206-5%205-2-1-1-3%201-6%203-4%206-11%206-14%200-2-1-1-1%202l-7%2012%201-7%201-9-1%205-2%207-1-7c-2-6-2-7-3-5s-1%202-2-1c-2-3-2-3-2-1l1%204c2%201%206%2010%206%2013l-1%204v2c2-1%202%200%202%203v4l5-6%207-11%201-5%201%204v7c0%202%200%203%201%202%201-2%202-1%202%204l1%204%202-10V51l2-5%202%206%202%2010c0%203%200%203%201%201%201-3%200-15-1-13%200%202-1%200-3-5l-3-7-1%207-1%2010c-2%203-2%203-3-6a2087%202087%200%2000-2-8m254%201l-1%206-1-3c-2-3-2-3-2%202l-2%2011-1%205%208-17v-3l2%204v19c2%200%202%201%202%204%201%206%203%205%203-3%201-6%200-9-2-7l-1-6-4-17-1%205M105%2057c-1%207-6%2019-7%2015%200-2%200-2-2%201-1%204-1%205%202%203%204-4%204%204%200%2011s-16%2013-29%2015c-7%201-9%200-9-4s0-4%204-4c5-1%205-4%200-3l-6-1c-1-1-1-1-1%201%202%205%202%2017%200%2021-2%206-2%208%200%203%202-2%202-2%202%200%200%203-2%207-3%207-2-1-2-1-2-9v-5l-1%205v5l-6-7-6-8%202-2%204-3c2%200%201-1-2-5l-4-4%201%206c0%205-2%2010-4%2010-4%200-15%2023-15%2031%200%206%202%2012%203%2012v-4c-2-3-2-10-1-15l2-3%201%203v6l1%205c1%202%201%202%201-1v-4l1%203v10h23v-3l1-2v5h29l29-1%201-5v-8c-1-5-1-5%206%201%205%205%205%206%205%209%201%205%202%205%202%201l-2-7-2-3%201-2%201%201c1%201%201%201%201-2s-1-4-3-3h-1l-1-1-1%203v2l-3-2c-4-3-4-4-1-4%204%200%2010-5%2010-8s-1-3-3-3c-3%200-3%200-3%204%200%203%200%203-3%203l-7-2c-1-2-2-2-2-1l5%204c5%202%204%203-3%201-4-1-6-2-7-5l-3-3-1-2h2l-1-3-2-1c-1%201-1%200-1-1l-2-9-2-6%202-2c5-3%207-9%207-16l2-10%202-10c0-9-1-8-1%200M19%2084c-1%208-4%2016-9%2023l-3%206%2012-11c4-5%204-6%204-11l-2-9-2-3v5m328%2020c-3%200-6%202-7%204-2%202-2%202-3%201-2-1-4-1-5%202s1%208%202%208c2%200%208-5%209-8%202-5%2015-8%2018-5%201%202%203%202%203-1s-10-4-17-1m-310%205c-3%201-6%206-6%2010v3l7-1%2010%201h3l-11-14-3%201m321%201l1%203v11c-1%201-1%200-1-4%200-8-1-9-3-3s-3%2011-1%209v3l3%2010c1%200%207-16%207-19%200-6-4-12-6-10m-297%208l-4%205-2%204h2c9-3%2017-2%2025%202%205%202%206%202%204%200l-11-6-10-5c-2-2-2-2-4%200'%20fill='%23d3d3d3'%20fill-rule='evenodd'/%3e%3c/svg%3e","aspectRatio":2.693548387096774,"src":"/static/8d1bf6999e928b13cbc6fdbe13b768c8/6a660/featured-image.png","srcSet":"/static/8d1bf6999e928b13cbc6fdbe13b768c8/1ec58/featured-image.png 334w,\n/static/8d1bf6999e928b13cbc6fdbe13b768c8/ccb4a/featured-image.png 668w,\n/static/8d1bf6999e928b13cbc6fdbe13b768c8/6a660/featured-image.png 851w","srcWebp":"/static/8d1bf6999e928b13cbc6fdbe13b768c8/4141f/featured-image.webp","srcSetWebp":"/static/8d1bf6999e928b13cbc6fdbe13b768c8/cd98f/featured-image.webp 334w,\n/static/8d1bf6999e928b13cbc6fdbe13b768c8/7535d/featured-image.webp 668w,\n/static/8d1bf6999e928b13cbc6fdbe13b768c8/4141f/featured-image.webp 851w","sizes":"(max-width: 851px) 100vw, 851px"}}}}}},"pageContext":{"slug":"/voiceloid-like-text2speech/","previous":{"fields":{"slug":"/how-to-convert-pcm-to-wav-with-ffmpeg/"},"frontmatter":{"title":"ffmpegでPCM音源をWAVE形式に変換するときにハマったこと","tags":["ffmpeg","Nodejs"]}},"next":{"fields":{"slug":"/report-builderscon-2017/"},"frontmatter":{"title":"Builderscon tokyo 2017に行ってきた","tags":["Builderscon","カンファレンス"]}}}},
    "staticQueryHashes": ["2585454260","2954598359"]}