(English)
スクラッチ・シンガー:音符を鳴らすスクラッチプロジェクトで歌声合成しよう
スクラッチプロジェクト(.sb2)をアップロード
なにをするスクリプト?
使い方
「大きな栗の木の下で」のボーカルを作ってみます。
ここでは下のような楽譜で歌ってもらいます。第二小節以降をスクラッチでプログラムしていきます。はじめの音符が休符でない場合は、全休符の小節がはじめに追加されます。
Step 1. スクラッチのプロジェクトファイル (.sb2)を用意
まずスクラッチで歌詞とメロディをプログラムします。 このスクラッチプロジェクト をもとに作ってみてください。
「song」という名前のスプライトにプログラムを書いていきます。
「・・と言う」と「・・の音符を・・拍鳴らす」のブロックをセットにして使います。
「・・拍休む」が休符になります。
歌詞はひらがな、音符の長さはすでにある変数を使います。ひらがなは音に合わせます。(例:「今日は」は「きょうわ」)
音符が小節をまたがないようにしてください。
詳しくはリンク先プロジェクトの「使い方」を見てください。
[ファイル] > [手元のコンピュータにダウンロード] からスクラッチのプロジェクトをsb2ファイルとしてダウンロードします。
sb2ファイルをダウンロード後にスクラッチのオフラインエディタを使うこともできます。
Step 2. スクラッチのプロジェクトファイル (.sb2) を MusicXML (.xml) へ変換
このページの上のほうにあるボタン を押して、作成したスクラッチのプロジェクトファイル(sb2という拡張子)をアップロードします。
うまくいくとダウンロードリンクが表示されるので、そこから変換されて出来たMusicXMLファイル(song.xml)をダウンロードします。
歌の一番はじめが休符でない場合は、冒頭に全休符の小節を自動的に加えます。
Step 3. MusicXML (.xml) を Sinsy へ入力して歌声合成
ダウンロードしたsong.xmlファイルを Sinsy (Singing Voice Synthesis) にアップロードします。「楽譜 (.xml)」にあるボタンを押すとアップロード画面が開きます。
ボーカルを選べます。「f000001j_dnn_beta」がよい感じです。
歌声をWAVファイルなどで聞いたりダウンロードできます。
練習
発展編:リップシンクや歌詞の表示
このページのはじめの動画のように、リップシンクして歌っている感じを出してみます。
サンプルプロジェクトはこんな感じ です。ちょっと下の説明は長いですが、タイマーとリストの組み合わせはいろいろ応用できるので、ぜひ試してみてください。
Step 2 で、MusicXMLと一緒に生成された song-timing.txt, song-lyric.txt, song-mouth.txt をダウンロードしておきます。
新たにスクラッチでプロジェクトを作り、歌わせたいスプライトに「a」、「i」、「u」、「e」、「o」、「m」という名前のコスチュームを用意し、口の形を変えておきます。
歌詞に「ん」が良く出てくるなら「n」も用意してください。「e」と同じでもよいです。
サンプルプロジェクト のコスチュームも参考にしてください。
音のタブで「ファイルから新しい音をアップロード」を選び、Step 3 でダウンロードした WAVファイルを読み込みます。
スクリプトのタブを開き、「データ」>「リストを作る」を使って、リストを3つ用意します。
名前はなんでもよいですが、この例では timing-list, lyric-list, mouth-list にしておきます。それぞれのリストへ song-timing.txt, song-lyric.txt, song-mouth.txt を読み込みます。
画面に表示されたリストの上で右クリック(もしくは二つ指クリック)をするとファイルからの読み込みができます。
timing-list には、何秒後に次の言葉に移るかが書かれています。
「データ」>「変数を作る」でリストを順にみるための変数を作っておきます。この例では idx_time にします。はじめは1にしておきます。
スクリプトに「音」>「…の音を鳴らす」のブロックを置き、その直後に「調べる」>「タイマーをリセット」を置きます。以上で準備は完了です。
あとは、「調べる」>「タイマー」のブロックを使って、タイマー(経過時間)と timing_list の idx_time番目とをループで比べながら、もし時間が来たら idx_time を1つ増やして次に進めます。下の図の左側のような流れになります。
今歌っている歌詞の言葉は lyric_list、口の形は mouth_list のそれぞれ idx_time番目から取り出せます。
mouth_list から取り出した文字に合わせてコスチューム変えることで口を動かします。
口の動きは、一つの音に二つ以上の文字が入ることや、一つの文字が二つの口の形に対応したり(「ま」は m と a など)するので、mouth_list から取り出した文字の列を順に調べる必要があります。右側の move_mouth のように、「その他」>「ブロックを作る」で新たにブロックを作っておくと便利です。
あとはサンプルプロジェクト をよく確認して、流れを追ってみてください。開始時のずれをなくすように一度音を読み込んでおいたり、歌詞のいらない記号を表示しないようにもしています。
Sinsyと組み合わせた合成例
test/song-homesweethome.wav
test/song-furusato.wav
「ハッピバースデー」を4人で歌ってみます(オンラインエディタ )
スプライト「Conductor」は表示されていませんが、他のスプライトに歌詞の表示や口を動かすタイミングをメッセージで伝えています。
変数「motion_offset」でやや口の動きを早めのタイミングにしているので、早すぎる場合はこれを減らします(0.2や0.1など)。
歌声合成のためのスクリプトはこちら です。
VIDEO
VIDEO
TODO
スクラッチ3のプロジェクトファイル (sb3) のサポート
ローカルで動かすのに必要なファイル
ネットワークにつながっていないときに使うには、Download Zip から Zipをダウンロード・展開し、以下のファイルを同じフォルダに入れておきます.
sb2musicxml.html
sb2musicxml.js
jszip.min.js
ライセンス
MITライセンス
jszip.min.js は https://stuk.github.io/jszip/ を利用しています。
付録:同期やリップシンクのテスト
「埴生の宿」を歌ってみます(スクラッチオンライン)
合成された歌声を合わせて同時に再生しています。一回目は再生が遅れることがありますが、その場合はいったん止めてもう一度再生してみてください。
スプライト「song」は、歌声合成用のスクリプトが元になっています。
作成した曲が長い(音が多い)とスクラッチのスクリプトの方が遅れてくるため、同期させるのであればスクラッチスクリプト内でタイマーを使ったほうがよいでしょう。
スプライト「Giga」の方はタイマーを使用した例です。詳しくは上の「発展編」を確認してください。
口の動き(リップシンク、口パク)も行っています。
「ふるさと」を歌ってみます(スクラッチオンライン)
スプライト「song」の beginning-silent-duration は、自動挿入された全休符の一小節分の時間が入っているので、これで再生タイミングを合わせます。
スプライト「song」は特に音符が多いところでずれてきますが、「Giga」はずれがなく、リップシンクもうまくいっています。