何年か前のイグノーベル賞でこんなのあったよなぁ~
ということで、対面しているカラスにカラス自身を撮影した動画をほんの少し遅れたタイミングで、カラスの音声とともに動画を流す「カラスにオウム返し」を作ってみた。
もちろん、カラスに限定せず、これは「鏡よ鏡よ鏡さんの。。。」あの魔女の愛用のミラーの現代版である。
ここから、検索もできるしショッピングも可能になるという未来型商品への入り口になるものだと考えられる。
。。。Alexaなんかのサービスのカメラや動画提供版はそういうイメージの商品だと考えられる。
。。。今回は、あくまで「動物会話」のワンシーンとして、フィールドに出た時カラスと遭遇、動物と遭遇を想定し、彼らに素直におのれの姿をフィードバックできるアプリを目指している。このアプリは以下の4につながるアプリである。
とりあえずの目標
1.犬・猫の音声認識
2.動物の音声認識
3.犬の種類・猫の種類の認識
4.犬・猫・カラスの声にそれぞれの声で反応を返す
5.犬・猫・カラスの話を翻訳して、人の声で返すと翻訳して返す
。。。
最終目標;「動物と日常会話ができるようになる」
やったこと
・動画と音声の同時リアルタイムな動画出力と保存
・コード解説
コードは以下に置きました
・hirakegoma/camera_input_movie.py
・動画と音声の同時リアルタイムな動画出力と保存
今回のアプリはほぼ先ほどアップした無音動画にカラスの音声を乗せるアプリの素直な拡張としています。
つまり、動画と音声を同時に収録して一定時間経過後に終了すると音声付き動画として保存する仕組みです。
ここで、本来なら並列化して一定時間ごとに裏側で保存する仕組みとしたいが、将来の課題とします。
・コード解説
使うものは前回と同じです。
# -*- coding: utf-8 -*-
import cv2
import pyaudio
import sys
import time
import wave
import pydub
from pydub import AudioSegment
import moviepy.editor as mp
今回はUSBカメラを利用して動画と音声を収録します。
cap = cv2.VideoCapture(0)
fps = 30
# 録画する動画のフレームサイズ(webカメラと同じにする)
size = (640, 480)
# 出力する動画ファイルの設定
fourcc = cv2.VideoWriter_fourcc(*'XVID')
output_file='output.avi'
video = cv2.VideoWriter(output_file, fourcc, fps, size)
今回はハウリングにてこずりました。また音声が綺麗に発生するかということも気を使い、以下のパラメータに落ち着きました。
streamの定義では、output=Trueにより出力をオンにしています。
CHUNK = 1024*5 #1024
FORMAT = pyaudio.paInt16
CHANNELS = 1 #monoral
#サンプリングレート、マイク性能に依存
RATE = 22050 #44100
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK,
output = True)
動画はframe、音声はframesに格納します。
また、キー入力待ちを少し長めにしてかつ音が変な音にならない100ms程度としています。
そして、終了後は速やかにvideoの終了処理を実施します。
これをやらないとoutput.aviがクローズせずエラーの原因になります。
frames = []
while (cap.isOpened()):
ret, frame = cap.read()
input = stream.read(CHUNK)
# 書き込み
video.write(frame)
# キー入力待機
if cv2.waitKey(97) & 0xFF == ord('q'):
break
# 画面表示
cv2.imshow('frame', frame)
output = stream.write(input)
frames.append(input)
# 終了処理
cap.release()
video.release()
cv2.destroyAllWindows()
以下で音声をout.wavにまとめて保存します。
wf = wave.open('out.wav', 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT)) #width=2 ; 16bit
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()
前回と同様に、以下で無声動画output.aviと音声ファイルout.wavを使って音声付動画output.mp4を作成します。
base_sound = AudioSegment.from_file('out.wav', format="wav")
base_sound.export("out.mp3", format="mp3") # 保存する
clip_output = mp.VideoFileClip(output_file).subclip()
clip_output.write_videofile(output_file.replace('.avi', '.mp4'), audio='out.mp3')
まとめ
・カラスとの遭遇に備えて「カラスにオウム返し」アプリを作成した
・カラス語識別機能を追加して、返事を行うように機能追加する
・詳細は控えるが、これをベースにいろいろな発展が期待できる