TL;DR
- Amazon Pollyを使うと流暢にスクリプトを読み上げてくれる。休みを入れたりとか細かい制御もSSML (Speech Synthesis Markup Language) を使って制御できる。ただ細かい単語を期待通りに一発で読んでくれないこともあるので試行錯誤ができるように変換スクリプトを用意しておくと便利でした。
やり方
- Amazon Pollyに話してほしいスクリプトを作成
- Amazon Pollyにスクリプトを音声に変換してもらう
これだけ
Amazon Pollyに話してほしいスクリプトを作成
SSML (Speech Synthesis Markup Language) でタグを付けてあげると細かい制御ができます。
全然難しくなくて単なるxmlです。
polly.xml
<?xml version="1.0"?>
<speak version="1.1"
xmlns="http://www.w3.org/2001/10/synthesis"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/10/synthesis http://www.w3.org/TR/speech-synthesis11/synthesis.xsd" xml:lang="en-US">
<prosody rate="80%">
This is sample
<break time="0.5s" />
You may edit the code <w role="amazon:NN">V</w><w role="amazon:NN">I</w> or <w role="amazon:NN">VIM</w>
</prosody>
</speak>
よく使ったタグ
- prosody rate:デフォルトだと読み上げスピードが早かったので少し遅くするために使った。ただあんまり遅くしすぎるとゆっくりになりすぎてしまうので80%くらいまでが限界
- break time:休みを意識的に入れたいときに使用した。ピリオドでも少し休みをいれてくれるが、意味の区切りでは少し長めに休みを入れたかったので使用
- w role="amazon:NN":名詞として読ませたかった場合に使用した特に大変だったのがviと読ませること
<w role="amazon:NN">V</w><w role="amazon:NN">I</w>
にしてVとIを一文字づつ読ませることでなんとか読んでくれるようになった
Amazon Pollyにスクリプトを音声に変換してもらう
Pollyに変換してもらうxmlファイルが完成したら実際に変換をします。AWSコンソールから変換できるのですが変換ファイルが増えてくると大変なのでスクリプト化しておきました
build.sh
#!/bin/bash
set -e
COMMAND=$1
TARGET_FILE=$2
start=`date +%s`
current_directory=`pwd`
script_dir=$(cd $(dirname $0); pwd)
cd $script_dir
voice=Matthew
convert() {
_create_dir
echo ${voice}
input_file=${TARGET_FILE}
file_name=${TARGET_FILE%%.*}
echo ${file_name}
_to_audio_file ${voice} ${input_file} ${file_name}
return 0
}
convert_all_files() {
_create_dir
echo ${voice}
for input_file in *_*.xml
do
file_name=${input_file%%.*}
echo ${file_name}
_to_audio_file ${voice} ${input_file} ${file_name}
done
return 0
}
_to_audio_file() {
voice=$1
input_file=$2
file_name=$3
aws polly synthesize-speech \
--text file://${input_file} \
--voice-id ${voice} \
--output-format mp3 \
--text-type ssml \
"../audio/${voice}/${file_name}.mp3"
return 0
}
_create_dir() {
mkdir -p ../audio/${voice}
return 0
}
case $COMMAND in
"--all" ) convert_all_files ;;
"--target" ) convert ;;
* ) echo "Usage: $0 --all | --target <TARGET_FILE_NAME>" 1>&2
exit 1 ;;
esac
end=`date +%s`
echo Time elapsed: $((end-start)) seconds
cd $current_directory
exit 0
スクリプト化しておくことで変換が大分楽になりました。
build.shと同じディレクトリにある全ファイルを変換
./build.sh --all
build.shと同じディレクトリにある特定のファイルを変換
./build.sh --target <TARGET_FILE_NAME>
例
./build.sh --target 1_sample.xml
音声の読み上げをターミナルから実施する
Macでコマンドラインから音楽を再生する。
で紹介されていたafplayコマンドを使ってました。