スマートスピーカー自作に挑戦!

FaceBookに投稿を始めている。
Amazon Alexa もRasPiで実現!

カテゴリー: RaspberryPi, お知らせ パーマリンク

スマートスピーカー自作に挑戦! への2件のフィードバック

  1. fujii のコメント:

    工夫点を忘れないようメモしておく。
    <ZeroInstallでも>
    Google Homeに後れを取るまいと、ここまで頑張った。
    ・RasberryPiZeroでも実行
    ・マイクのMute⇒voiceで発話
    ・ボタンを押して・・・のとき「HeyGugo」も可能
    ・英語に切り替えて
    ・set to Japanese
    ・~は西暦何年?
    ・今日は何曜日ですか
    ・私は何曜日に生まれたの
    ・パリの時刻は
    ・イスタンブールはどこの首都ですか
    ・NHKでは何を放送している
    ・その番組詳細を知りたい
    ・フジテレビの午後10時の番組を調査して
    ・その午後11時の番組を調査したい
    ・その次は何か
    ・京浜東北線は順調ですか
    ・その状況は進んでいますか
    ・愚痴聞いてタンバリン
    ・般若心経を聴かせて
    ・YouTubeでトランプさんの孫のPPAPが見たい
    ・YouTubeでトランプさんの孫のPPAPをキャストしたい
    ・もう一度
    ・もう一度同じもの

    <テクニック上の工夫>
    1)ボタン押下とHotwordの並行両立のために
      def on_button_press():
        global buttonFlag, events
        if buttonFlag==False and events:
            buttonFlag = True
            events.offer(Event(EventType.ON_NO_RESPONSE,{'button':'ON'}))
        buttonFlag = True
      ボタン押下をイベント捕獲し、assistantのイベントQueへ追加
      さらにチャタリング対策(二重イベント排除)のフラグ制御
    
    2)ミュート解除による発話許可
        bashによるマイク音量変化検出(--use_muteのときのみ)
        nanaF=0
        arecord -d 1 -t raw - >nul
        arecord -d $1 -t raw - |
        od -v -A n -t x1 | tr -Cd '[0123456789abcdef\EOF]' |
        while read -N 2 i
      do
        MOJI=${i}
        if [ "$MOJI" = "7f" -o "$MOJI" = "80" ]; then
          (( nanaF-- ))
        else
          (( nanaF++ ))
        fi
        if [ $nanaF -gt 20 ]; then
           echo $nanaF
           exit 0
        fi
        if [ $nanaF -lt -2000 ]; then
           exit 0
        fi
      done
       stdoutへの文字出力で発話開始を判断
      ただし、この検出の間、マイクを完全解放するために、
      assistant.conversation_stream._source.close()
      検出後復活:
        audio_source._audio_stream = sd.RawStream(
                    samplerate=audio_sample_rate,
                    dtype='int16', channels=1,
                    blocksize=int(audio_block_size/2)
                )
      
    3)打ち切りのための発話検出
      HotwordかボタンでQueに追加されたイベントを調べてLoopする
      events.qsize()で確認後、events.get(False)で消費しておく
       
    4)ARMv6での実行のためのStream対策
       assistの頭で、ファイルを確保
            if arch_v6:
                try:
                    (fd, tts_wav) = tempfile.mkstemp(suffix='.wav', dir=TMP_DIR)
                except IOError:
                    logger.exception('Using fallback directory for TTS output')
                    (fd, tts_wav) = tempfile.mkstemp(suffix='.wav')
                os.close(fd)
                fd = open(tts_wav, 'wb')
      途中のオーディオデータをファイルに出力
                if  len(resp.audio_out.audio_data) > 0:
                    if arch_v6:fd.write(resp.audio_out.audio_data)
      最後に、オーディオデータをAplayで発声
            if arch_v6:
                fd.close()
                with open(tts_wav, 'rb') as wav:
                    frames = wav.read()
                    if len(frames)>0:
                        cmd = "aplay -q -t raw -c 1 -f s16 -r 16000"
                os.unlink(tts_wav)
    
    5)assistantの完全停止のために
             subprocess.Popen(["killall","python"])
             sys.exit(0)
    6)番外
      Hey Google をガイドするアナウンスが、自分自身をwakeしてしまうので、
             hotAssist.set_mic_mute(True)  # self hotword suppless
             subprocess.call(["aplay","hey.wav"],stderr=subprocess.DEVNULL)
             hotAssist.set_mic_mute(False)
        なお、omxplayer の途中停止は、python3 からは次のように投入。
             player.stdin.write('q'.encode('utf-8'))
    
    
  2. fujii のコメント:

    Chromecastへのキャストで、YouTubeのURLを正しく伝える試行錯誤が大変だった。
    (&をスルーで伝えるために)
    cmdl = “curl -G –data-urlencode url='”+html+”‘ http://“+ipad+”:5000/play/”

    mc.play_media(mp4_url.strip(“‘”), ‘video/mp4’)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です