이 내용은 Raspberry Pi Voice Recognition Works Like
Siri에 있는 스크립트를 OSX에서 작동하도록 변경한 내용이다. 원 제작자의 허락을 전혀 득하지 않았으므로 문제가 될 소지가 충분히 있지만, 아이디어가 너무 좋아서 소개를 하고자 한다.

사용 API

사용 프로그램

sox

  • 사운드 레코딩 및 flac 변환 담당
  • $ brew install sox --with-flac

wolframalpha

  • Python 패키지
  • woframalpha API 질의 담당
  • $ pip install wolframalpha

mplayer

  • mp3 포맷 play 담당
  • $ brew install mplayer

구조

speech2text.sh

LANGUAGE="en-us"

# 샘플링 레이트를 16,000로 바꾼다. 구글 음성인식 API는 16K의 flac 포맷만 가능.
rec -t flac -q - | sox - out.flac rate 16k 

wget -q -U "Mozilla/5.0" --post-file out.flac --header "Content-Type: audio/x-flac; rate=16000" 
  -O - "http://www.google.com/speech-api/v1/recognize?lang=${LANGUAGE}&client=chromium" 
  | cut -d\" -f12  > stt.txt

rm out.flac

queryprocess.py

mport wolframalpha
import sys

# Get a free API key here http://products.wolframalpha.com/api/
# This is a fake ID, go and get your own, instructions on my blog.
app_id='R6EJKE-9XLLHX2EA2'

client = wolframalpha.Client(app_id)

query = ' '.join(sys.argv[1:])
res = client.query(query)

if len(res.pods) > 0:
    texts = ""
    pod = res.pods[1]
    if pod.text:
        texts = pod.text
    else:
        texts = "I have no answer for that"
    # to skip ascii character in case of error
    texts = texts.encode('ascii', 'ignore')
    print texts
else:
    print "Sorry, I am not sure."

text2speech.sh

#!/usr/bin/env bash

INPUT=$*
STRINGNUM=0
ary=($INPUT)
for key in "${!ary[@]}"
do
  SHORTTMP[$STRINGNUM]="${SHORTTMP[$STRINGNUM]} ${ary[$key]}"
  LENGTH=$(echo ${#SHORTTMP[$STRINGNUM]})

  if [[ "$LENGTH" -lt "100" ]]; then
    SHORT[$STRINGNUM]=${SHORTTMP[$STRINGNUM]}
  else
    STRINGNUM=$(($STRINGNUM+1))
    SHORTTMP[$STRINGNUM]="${ary[$key]}"
    SHORT[$STRINGNUM]="${ary[$key]}"
  fi
done
for key in "${!SHORT[@]}"
do
  say() { local IFS=+;mplayer -really-quiet -noconsolecontrols 
    "http://translate.google.com/translate_tts?tl=en&q=${SHORT[$key]}"; }
  say $*
done

main.sh

#!/usr/bin/env bash

while :
do
  echo "Recording... Press Ctrl+C to Stop."

  ./speech2text.sh

  QUESTION=$(cat stt.txt)
  echo "Me: " $QUESTION
  rm stt.txt

  ANSWER=$(python queryprocess.py $QUESTION)
  echo "Robot: " $ANSWER

  ./text2speech.sh $ANSWER
done

github 소스