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を使って、日本語で歌わせるようにするのは、なかなか難しそうです。