June 8, 2020

SpeechMarkdownとSSML

Speech Markdown というものがある。

ふつうの Markdown は HTML を簡易的な記法で書くためのものだけど、Speech Markdown は Speech Synthesis Markup Language (SSML) という音声合成や Text-to-speech 向けの XML の簡易記法として用いられる。 SSML は W3C 勧告が存在する。 この分野には詳しくないが、Amazon Alexa や Google Assistant のドキュメントを見る限りでは、これらの SDK で利用できるようだ。

ここでは、Google Text-to-Speech API で、この Speech Markdown で書かれたテキストを発話させてみる。

雑にリポジトリ にまとめてある。

下準備

GCP の Console で対象の Project の Text-to-speech API を有効にしておく。

Speech Markdown -> SSML

Speech Markdown の JavaScript 実装を利用する。 今回は GCP を使うので、ざっくりと以下のようになる。

// 適当にSpeech Markdownを読み込んでおく
// var markdown =

// GoogleのTTS向けのサブセットを利用する
const options = {
  platform: "google-assistant",
};
const speech = new smd.SpeechMarkdown();
const ssml = speech.toSSML(markdown, options);

SSML で定義されているタグは幅広く、たとえば Speech Markdown では (some text)[disappointed] で表されるような「失望」という状態の表現なんかもある。

とはいえ、実際に使えるタグ(上記のようなものは Modifier という)は限られていて、たとえば disappointedGoogle Assistant の SSML では対応していない

適当に SSML を吐けるようにしておく。

node sm2ssml.js input.speechmarkdown > input.ssml

Google Text-to-speech API による発話音声ファイル出力

Text-to-speech の API が使えるプログラミング言語ならなんでもいいが、ここでは Python3 を使う。

# Virtualenvを作る
python -m venv .venv
source .venv/bin/activate

# Virtualenv内に必要なパッケージをインストールする
pip install google-cloud-texttospeech==2.0.0

ミニマルなコード例はこんな感じ。

from google.cloud import texttospeech as tts

with open("input.ssml") as f:
    ssml = f.read()

client = tts.TextToSpeechClient()

# 入力形式は text or ssml
tts_input = tts.SynthesisInput(ssml=ssml)

# 声色の設定: nameが空だと language_code に応じたデフォルト音声が選ばれる
voice = tts.VoiceSelectionParams(
    language_code="ja-JP",
    name="ja-JP-Wavenet-D",
    ssml_gender=tts.SsmlVoiceGender.MALE
)

audio_config = tts.AudioConfig(audio_encoding=tts.AudioEncoding.MP3)
response = client.synthesize_speech(input=tts_input, voice=voice, audio_config=audio_config)

with open("output.mp3", "wb") as out:
    out.write(response.audio_content)

利用できる音声のリスト によると、少し前に話題になっていた WaveNet を使った音声合成モデルも利用できる。 日本語音声も WaveNet 版と通常版が選べる。

はい、おわり。

もともと何がしたかったのか

学会のポスターセッションでの発表をオンラインでやるときに、毎回同じような説明をするのが面倒だったので事前録画しておこうと思ったが、 緊張するし何度もリテイクすることになったら余計落ち込んじゃうので、TTS にやらせようと思いつき、やり方を調べたのであった。

おまけ

Bloodborne のあの人のセリフをSpeech Markdownにしてみたので、TTSに読ませてみた。 WaveNetのほうがPitchを上げると声がかすれやすい印象……。

©2011-2020 tuxedocat