scratch-singer

Convert a scratch project file to a MusicXML for Sinsy (Singing Voice Synthesis)

This project is maintained by memakura

(English)

スクラッチ・シンガー:音符を鳴らすスクラッチプロジェクトで歌声合成しよう

なにをするスクリプト?

使い方

「大きな栗の木の下で」のボーカルを作ってみます。

ここでは下のような楽譜で歌ってもらいます。第二小節以降をスクラッチでプログラムしていきます。はじめの音符が休符でない場合は、全休符の小節がはじめに追加されます。

ookinakuri-score.png

Step 1. スクラッチのプロジェクトファイル (.sb2)を用意

  1. まずスクラッチで歌詞とメロディをプログラムします。 このスクラッチプロジェクト をもとに作ってみてください。
    • 「song」という名前のスプライトにプログラムを書いていきます。
    • 「・・と言う」と「・・の音符を・・拍鳴らす」のブロックをセットにして使います。
    • 「・・拍休む」が休符になります。
    • 歌詞はひらがな、音符の長さはすでにある変数を使います。ひらがなは音に合わせます。(例:「今日は」は「きょうわ」)
    • 音符が小節をまたがないようにしてください。
    • 詳しくはリンク先プロジェクトの「使い方」を見てください。
  2. [ファイル] > [手元のコンピュータにダウンロード] からスクラッチのプロジェクトをsb2ファイルとしてダウンロードします。
    • sb2ファイルをダウンロード後にスクラッチのオフラインエディタを使うこともできます。

howto

Step 2. スクラッチのプロジェクトファイル (.sb2) を MusicXML (.xml) へ変換

  1. このページの上のほうにあるボタンを押して、作成したスクラッチのプロジェクトファイル(sb2という拡張子)をアップロードします。
  2. うまくいくとダウンロードリンクが表示されるので、そこから変換されて出来たMusicXMLファイル(song.xml)をダウンロードします。
    • 歌の一番はじめが休符でない場合は、冒頭に全休符の小節を自動的に加えます。

Step 3. MusicXML (.xml) を Sinsy へ入力して歌声合成

  1. ダウンロードしたsong.xmlファイルを Sinsy (Singing Voice Synthesis) にアップロードします。「楽譜 (.xml)」にあるボタンを押すとアップロード画面が開きます。
    • ボーカルを選べます。「f000001j_dnn_beta」がよい感じです。
  2. 歌声をWAVファイルなどで聞いたりダウンロードできます。

flow_JA.png

練習

発展編:リップシンクや歌詞の表示

このページのはじめの動画のように、リップシンクして歌っている感じを出してみます。 サンプルプロジェクトはこんな感じです。ちょっと下の説明は長いですが、タイマーとリストの組み合わせはいろいろ応用できるので、ぜひ試してみてください。

  1. Step 2 で、MusicXMLと一緒に生成された song-timing.txt, song-lyric.txt, song-mouth.txt をダウンロードしておきます。
  2. 新たにスクラッチでプロジェクトを作り、歌わせたいスプライトに「a」、「i」、「u」、「e」、「o」、「m」という名前のコスチュームを用意し、口の形を変えておきます。
    • 歌詞に「ん」が良く出てくるなら「n」も用意してください。「e」と同じでもよいです。
    • サンプルプロジェクトのコスチュームも参考にしてください。
  3. 音のタブで「ファイルから新しい音をアップロード」を選び、Step 3 でダウンロードした WAVファイルを読み込みます。
  4. スクリプトのタブを開き、「データ」>「リストを作る」を使って、リストを3つ用意します。
    • 名前はなんでもよいですが、この例では timing-list, lyric-list, mouth-list にしておきます。それぞれのリストへ song-timing.txt, song-lyric.txt, song-mouth.txt を読み込みます。
    • 画面に表示されたリストの上で右クリック(もしくは二つ指クリック)をするとファイルからの読み込みができます。
    • timing-list には、何秒後に次の言葉に移るかが書かれています。
  5. 「データ」>「変数を作る」でリストを順にみるための変数を作っておきます。この例では idx_time にします。はじめは1にしておきます。
  6. スクリプトに「音」>「…の音を鳴らす」のブロックを置き、その直後に「調べる」>「タイマーをリセット」を置きます。以上で準備は完了です。
  7. あとは、「調べる」>「タイマー」のブロックを使って、タイマー(経過時間)と timing_list の idx_time番目とをループで比べながら、もし時間が来たら idx_time を1つ増やして次に進めます。下の図の左側のような流れになります。
  8. 今歌っている歌詞の言葉は lyric_list、口の形は mouth_list のそれぞれ idx_time番目から取り出せます。
    • mouth_list から取り出した文字に合わせてコスチューム変えることで口を動かします。
    • 口の動きは、一つの音に二つ以上の文字が入ることや、一つの文字が二つの口の形に対応したり(「ま」は m と a など)するので、mouth_list から取り出した文字の列を順に調べる必要があります。右側の move_mouth のように、「その他」>「ブロックを作る」で新たにブロックを作っておくと便利です。
    • あとはサンプルプロジェクトをよく確認して、流れを追ってみてください。開始時のずれをなくすように一度音を読み込んでおいたり、歌詞のいらない記号を表示しないようにもしています。

lipsync-script

Sinsyと組み合わせた合成例

  1. test/song-homesweethome.wav
  2. test/song-furusato.wav
  3. 「ハッピバースデー」を4人で歌ってみます(オンラインエディタ
    • スプライト「Conductor」は表示されていませんが、他のスプライトに歌詞の表示や口を動かすタイミングをメッセージで伝えています。
    • 変数「motion_offset」でやや口の動きを早めのタイミングにしているので、早すぎる場合はこれを減らします(0.2や0.1など)。
    • 歌声合成のためのスクリプトはこちらです。

TODO

ローカルで動かすのに必要なファイル

ネットワークにつながっていないときに使うには、Download Zipから Zipをダウンロード・展開し、以下のファイルを同じフォルダに入れておきます.

ライセンス

付録:同期やリップシンクのテスト

  1. 「埴生の宿」を歌ってみます(スクラッチオンライン)
    • 合成された歌声を合わせて同時に再生しています。一回目は再生が遅れることがありますが、その場合はいったん止めてもう一度再生してみてください。
      • スプライト「song」は、歌声合成用のスクリプトが元になっています。
    • 作成した曲が長い(音が多い)とスクラッチのスクリプトの方が遅れてくるため、同期させるのであればスクラッチスクリプト内でタイマーを使ったほうがよいでしょう。
      • スプライト「Giga」の方はタイマーを使用した例です。詳しくは上の「発展編」を確認してください。
    • 口の動き(リップシンク、口パク)も行っています。
  2. 「ふるさと」を歌ってみます(スクラッチオンライン)
    • スプライト「song」の beginning-silent-duration は、自動挿入された全休符の一小節分の時間が入っているので、これで再生タイミングを合わせます。
    • スプライト「song」は特に音符が多いところでずれてきますが、「Giga」はずれがなく、リップシンクもうまくいっています。