시리 흉내내기
이 내용은 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
시리 흉내내기 from YongHun Byun