COZMO SDK:Tutorials Basics 06

6つめのチュートリアル。「ドレミファソラシド」を歌います。
正確に歌えるわけじゃないんですが、しゃべる時の声の高さを変える方法です。

/examples/tutorials/01_basics/06_sing_scales.py

使用するAPIは、チュートリアル1で使った「say_text」

say_text(text, play_excited_animation=False, use_cozmo_voice=True, duration_scalar=1.0, voice_pitch=0.0, in_parallel=False, num_retries=0)

http://cozmosdk.anki.com/docs/generated/cozmo.robot.html#cozmo.robot.Robot.say_text

voice_pitch パラメータで声の高さを変化させます。duration_scalar パラメータでしゃべる速度も変更しています。


発声する言葉を指定。

scales = ["Doe", "Ray", "Mi", "Fa", "So", "La", "Ti", "Doe"]

-1.0~1.0を均等に割った分で、発声するごとに pitch を上げていきます。1回で上げるピッチの値は以下の計算。

voice_pitch_delta = 2.0 / (len(scales) - 1)

合わせて、腕と頭も動かしています。腕と頭、角度を直接指定して動かしてますね。

set_lift_height(height, accel=10.0, max_speed=10.0, duration=0.0, in_parallel=False, num_retries=0)

heightの指定は 0.0(一番下) ~ 1.0(一番上)
http://cozmosdk.anki.com/docs/generated/cozmo.robot.html#cozmo.robot.Robot.set_lift_height

set_head_angle(angle, accel=10.0, max_speed=10.0, duration=0.0, warn_on_clamp=True, in_parallel=False, num_retries=0)

angleの指定は、 -0.44ラジアン(-25.00度。一番下) ~ Angle 0.78ラジアン (44.50度。一番上)
http://cozmosdk.anki.com/docs/generated/cozmo.robot.html#cozmo.robot.Robot.set_head_angle


プログラムでは、最初に顔と腕を初期位置に移動。

robot.move_head(-5) # start moving head down so it mostly happens in parallel with lift
robot.set_lift_height(0.0).wait_for_completed()

腕を移動するときに、合わせてちょっと顔も下向きに動かしてます。

robot.set_head_angle(degrees(-25.0)).wait_for_completed()

その後、顔の位置を正確に指定。これで顔がまっすぐ、腕が一番下になります。

robot.move_lift(0.15)
robot.move_head(0.15)

そこから、顔と腕を 毎秒0.15ラジアンずつ上に上げる動作をスタートして、同時に発音開始。

for note in scales:
    robot.say_text(note, voice_pitch=voice_pitch, duration_scalar=0.3).wait_for_completed()
    voice_pitch += voice_pitch_delta

scales の内容を最初から最後まで発声しつつ、1つ発生するごとに voice_pitch_delta 分だけ声を高くする。プログラム終了で顔と腕の上がるのも停止。


チュートリアル1でも書きましたが、端末を日本語設定にしている場合、duration_scalar がうまく動作してくれないみたいです。

あと、発声の指定が

scales = ["Doe", "Ray", "Mi", "Fa", "So", "La", "Ti", "Doe"]

なので、アルファベット読みしてしまって「ディーオーイー」とか言い始めます。

メチャクチャや…。(”So”の時、なんて言ってるのか謎…。スタンドオフ?)

日本語にしてあげよう。

scales = ["ド", "レ", "ミ", "ファ", "ソ", "ラ", "シ", "ド"]

動作の速度も調整。

# Start slowly raising lift and head
 robot.move_lift(0.1)
 robot.move_head(0.1)
# "Sing" each note of the scale at increasingly high pitch
 for note in scales:
 robot.say_text(note, voice_pitch=voice_pitch, duration_scalar=0.1).wait_for_completed()
 voice_pitch += voice_pitch_delta

こんな感じ。スクリプトに日本語が混じったので、ファイルの文字コードを「UTF-8」にするのをお忘れなく!

なんとなく音程は変化しているものの、voice_pitch指定もうまくいってない感じですね…。
say_textを使って、日本語で歌わせるようにするのは、なかなか難しそうです。