pythonのAPIについて

サイトへのご意見・ご要望 pythonのAPIについて

  • このトピックには2件の返信、2人の参加者があり、最後にlaboにより4年、 2ヶ月前に更新されました。
3件の投稿を表示中 - 1 - 3件目 (全3件中)
  • 投稿者
    投稿
  • #1486
    labo
    参加者

    いつもお世話になっております。

    今回APIの仕組みについてお聞きしたいのですが、関数で音声認識する関数と「調子はどうですか」と言う関数を用意しました。
    音声合成の途中で音声認識が作動してしまい、音声認識にPaperoの声が入ってしまいます。
    1つのAPIの途中に割り込む問題を解決できる方法をお聞きしたく質問させてもらいました。
    現在はsleep関数を入れて実行していますが、別の解決法などあれば教えてもらえると幸いです。
    お忙しいと思いますが、よろしくお願いします。

    現在のプログラムは添付しています。

    Attachments:
    You must be logged in to view attached files.
    #1488
    まつやま
    参加者

    こんにちは。まつやまと申します。

    PaPeRo iはコマンドを非同期で実行しますので、それが便利なときもあれば、思わぬ副作用をもたらすこともありますよね。
    私もときどきそれを忘れて、不可解なバグに悩まされることがあります。

    PaPeRo iがしゃべり終わってから次の動作を実行させるには、以前このフォーラムに掲載された

    PaPeRoにおける終話検知について


    というトピックが参考になるかと思います。

    関数内でローカルなイベントループを作り、send_get_speech_status()を送って結果がgetSpeechStatusRes.Return == 0になるまで繰り返すという方法なら、文章の長さにかかわらず、音声合成が終わるまで待つことができます(少しタイムラグが発生しますが)。

    かなり端折った書き方ですが、

    def wait_until_end_of_speech():
    send_get_speech_status()
    while True
    msg = papero_robot_message_recv(0.5)
    if msg[‘Name’] == ‘getSpeechStatusRes’:
    if msg[‘Return’] == 0:
    # 発話終了
    break
    else:
    # 発話継続中…再チェック
    sleep(0.5)
    send_get_speech_status()
    else:
    # getSpeechStatusRes以外のメッセージは破棄(要検討)

    speech()
    wait_until_end_of_speech()
    record()

    みたいなイメージです。
    実際には、適度にsleepを入れたり、一定時間経過したら強制的にループを抜けるようにした方がよいと思います。
    こういうやり方がベストかどうかは、分かりませんが…(^_^;)

    なにか参考になりましたら幸いです。

    #1648
    labo
    参加者

    いつもお世話になっております。遅いお返事になり、申し訳ありません。
    sleep版と提案された方法で比べてみますと、提案された方法が安定しました。
    ご指導ありがとうございました。

3件の投稿を表示中 - 1 - 3件目 (全3件中)
  • このトピックに返信するにはログインが必要です。