いものやま。

雑多な知識の寄せ集め

GCPのText-to-Speechでストレッチ音声を作ってみた。

f:id:yamaimo0625:20200618193136j:plain

きっかけ

一日中パソコンに向かってることが多いので、とにかく首と肩のコリが酷い。
おそらくそれが原因で頭痛がすることも。

さらに最近は外出も自粛してるので、腰や脚の方にもけっこうコリが出ていた。

一応、整体には通っているものの、対処療法という感は拭えないので、やはりストレッチを行って根本的に改善していかないとなぁ、と。

そんな中、Twitterでなかなか良さそうな本が流れてきたので、試しに買ってみた。

猫背の改善から始まり、首・肩・背中のコリ、腰・足のコリをほぐすストレッチが、イラストで伸ばす筋肉の説明と共に合計27個紹介されている。
実際にやってみると、たしかにぐおぉという感じで伸びを感じる・・・
これは効きそう。

問題点

ということで、毎日お風呂上がりにでもやっていこうかなと思ったんだけど、ここでちょっと問題点が。

  1. 覚えられない
  2. カウントがツラい
  3. 味気ない

まず、覚えられない
27個も紹介されてると、それぞれの動きを覚えるのも大変だし、どのストレッチをまだやってないのか覚えておくのも大変。
本を開いて順番にめくっていけば問題ないとも言えるけど、1つやるたびにページをめくるのはとても手間。

次に、カウントがツラい
1つのストレッチにつき、20秒×3セットやることが推奨されてるんだけど、20秒を自分で数えるのは大変。
タイマーを使うという手もあるかもしれないけど、1つやるたびにボタンを押したりするのは面倒。

最後に、味気ない
こう、無音の中でじっと筋肉を伸ばすのは、なんというか、ね。
せっかくだからリラックスできる音楽とか聴きながらストレッチしたいところ。

解決策

これらの問題点をどうしようかと考えて思いついたのが、音声ガイド
手順を音声で教えてくれて、カウントもお任せし、ついでにいい感じのBGMとかも一緒に流せば万事解決!

となると、問題となるのは音声データをどう作るかだけど、自分で吹き込むのはアレなので、Text-to-Speechを使って作ることにした。

macOSには標準で音声読み上げ機能がついてるんだけど、試しに使ってみたところ、かなり微妙。。。
代わりにGCPのText-to-Speechを試してみたら、なかなかいい感じだったので、GCPのText-to-Speechを使ってみることにした。

GCP Text-to-Speech

GCPのText-to-Speechは100万文字/月までは無料で使えるので、今回の用途なら無料でOK。
よく使われる言語(Rubyも含まれる)向けのライブラリも用意されてるので、簡単に使えた。

使い方はクイックスタート: クライアント ライブラリの使用  |  Cloud Text-to-Speech のドキュメントに書いてある通りに進めればOK(手抜き)。

読み上げるテキストとそれを保存するファイル名は、あとでファイル(YAML形式)で渡す形にしたかったので、次のようなRubyプログラム(text_recorder.rb)を書いてみた:

require "google/cloud/text_to_speech"
require 'yaml'

USAGE = <<~END_OF_USAGE
  Syntax:
    ruby text_recorder.rb <target>.yml

  Format of <target>.yml:
    - file: <output1>
      text: <text1 to speech>
    - file: <output2>
      text: <text2 to speech>
    ...
END_OF_USAGE

if ARGV.empty?
  puts USAGE
  exit 1
end

entries = YAML.load_file(ARGV[0])
if entries.empty?
  puts USAGE
  exit 1
end
total = entries.size

client = Google::Cloud::TextToSpeech.text_to_speech
voice = { language_code: "ja-JP", name: "ja-JP-Wavenet-B" }
audio_config = { audio_encoding: "MP3" }

entries.each_with_index do |entry, i|
  input = {text: entry['text']}
  output = entry['file']
  output += '.mp3' unless output.end_with?('.mp3')

  current = i + 1
  STDOUT.print("[#{current}/#{total}] #{output} ... ")
  STDOUT.flush

  response = client.synthesize_speech(input: input, voice: voice, audio_config: audio_config)
  File.open(output, "wb") do |file|
    file.write response.audio_content
  end

  STDOUT.puts('Done.')
end

そして、次のような入力ファイル(stretch.yml)を用意する:

- file: 僧帽筋
  text: |-
      首の後ろを伸ばします。
      両指を組み、頭の後ろに回して、脇を絞めます。
      首を真下に向け、頭を下に押して伸ばします。
- file: 胸鎖乳突筋(右)
  text: |-
      首の横を伸ばします。
      首を左に傾け、右手の甲を腰の裏に回します。
      あごを少し上に向け、左手で頭を掴み、そのまま斜め後ろに引いて伸ばします。
(以下省略)

あとはコマンドラインで以下を実行:

$ ruby text_recorder.rb stretch.yml

これで「僧帽筋.mp3」や「胸鎖乳突筋(右).mp3」などが作られ、指定された文章が読み上げられた音声データが出来る。
あとは動画編集ソフトとかを使ってちょちょいと音声データをつなぎ合わせれば、完成!

出来上がった音声データ

せっかくなのでYouTubeにアップしてみた。
(好きなBGMを合わせた方がいいと思うので、BGMなしになっている)

なお、本では27個のストレッチが紹介されてるけど、動画では18個に減らしてる。
これは、27個全部やったら1時間近くになるから・・・(左右があるので、実質50個強のストレッチをやることになる)
同様の理由で、20秒×3セットではなく、15秒×3セットにしている。

それと、菱形筋と腰方形筋のストレッチはアレンジしてある。
前者は床に座って行う手順だったんだけど、床に座るのは面倒だったので、椅子に座ったままできるように変えている。
また、後者は手を体の前に落とすイラストになっているんだけど、体の横に落とすようにした方がよく伸びたので、変えている。

あと、ストレッチの並び順も、椅子に座って行えるもの→立って行うものと変えてる。
本に書かれた順番でやるよりもずっとやりやすくなってるはず。

ちなみに、自分はBGMとして以下の音楽をつけてみた:

最初はドビュッシーピアノ曲をつけようと思ったんだけど、クラシック音楽は聴き入ると自然と体が動いてしまうので、雰囲気を出すだけのBGMの方がいいのかも。

今日はここまで!