leap motionとlambdaで「第九」を鳴らしてみる
TRANSCRIPT
Ⓒ Classmethod, Inc.
Leap motionとLambdaを使って「第九」を鳴らしてみる
1
DevIO MTUP11-SAPPORO-006
清野 剛史, AWSエンジニア, Classmethod Inc,
Dec, 12, 2004
みなさん
ここまで休憩も無しの長丁場
お疲れ様です
2
癒やしのお時間です
3
Ⓒ Classmethod, Inc.
自己紹介• 清野 剛史 • AWSエンジニア • 7月入社 • つまりまだまだ新人 • 今までのDevIOでの発表 • 最近のガジェットについて • Yoについて
• AWSについてロクに触れていない • 今夜はちょっとAWS触れます
4
Ⓒ Classmethod, Inc.
re:Invent 2014• AWS Lambda発表
5
Ⓒ Classmethod, Inc.
これからのコアサービスになるかも
6
AWS Lambdaとは
7
20分前に説明されているかと思うので割愛
8
Ⓒ Classmethod, Inc.
Lambdaの使い道
• 定期バッチ • 動画や写真等のフォーマット、サイズ変換 • IoT (Internet of Things)、センサー系データの処理 • データをDWH等に投入する際の前処理 • Kinesis等のリアルタイムデータの後処理
9
Ⓒ Classmethod, Inc.
Lambdaの使い道
• 定期バッチ • 動画や写真等のフォーマット、サイズ変換 • IoT (Internet of Things)、センサー系データの処理 • データをDWH等に投入する際の前処理 • Kinesis等のリアルタイムデータの後処理
10
Ⓒ Classmethod, Inc.
Leap Motion
11
Ⓒ Classmethod, Inc.
Leap Motion SDK V2 (Beta)変更点
・Skeletal Trackingの導入
・右手、左手の検出
・指の種類
・指の関節を検出
・Pinch、Grabの検出
・検出値の信頼度(Data Confidence)の表示
C++, Unity/C#, JavaScript, Java, Python, Objective-C等の言語を用意
今回はJavaScript SDKのラップライブラリ「LeapJS」を使用
https://github.com/leapmotion/leapjs12
Demo
13
Ⓒ Classmethod, Inc.
今回やってみること1. Leap Motionよりデータを出力
2. Cognitoを使用してJavaScriptからKinesisに投入
3. KinesisからLambdaを起動
4. Lambdaを使ってデータを整形してSQSに入れる
5. JavaScriptからSQSデータを拾う
6. Web Audio APIを使用して音量、位相を変える
14
Ⓒ Classmethod, Inc.
Web Audio API・音声を処理、合成するためのWebアプリケーション向けHTML5 JavaScript API
・音源を「再生」するのではなく「音源」として解釈し、ピッチの調整、フィルター、PANNING等が可能。
・音波から作りこむような仕様の為、シンセサイザーの基礎知識が無いとハードルが高い
・ラップライブラリが出てきて使いやすくなった
https://github.com/goldfire/howler.js/tree/2.0
15
Demo
16
Ⓒ Classmethod, Inc.
今回やってみること
17
Song
Beethoven: Symphony #9 In D Minor, Op. 125, "Choral" - 4. Presto
18
Ⓒ Classmethod, Inc.
Kinesis Settingstream_name = Demono9
ARN = arn:aws:kinesis:us-east-1:xxxxxxxxxx:stream/Demono9
number of shard = 1
19
Ⓒ Classmethod, Inc.
SQS Settingqueue_name = Demono9
URL = https://sqs.us-east-1.amazonaws.com/xxxxxxxxxx/Demono9"
ARN = arn:aws:sqs:us-east-1: xxxxxxxxxx:Demono9
20
Ⓒ Classmethod, Inc.
Cognito 認証var AWS = require('aws-sdk');
var awsRegion = "us-east-1";
var cognitoParams = {
AccountId: "XXXXXXXXXXXX",
RoleArn: "arn:aws:iam::XXXXXXXXXXXX:role/Cognito_demo09_DefaultRole",
IdentityPoolId: "us-east-1:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
};
AWS.config.region = awsRegion;
AWS.config.credentials = new AWS.CognitoIdentityCredentials(cognitoParams);
AWS.config.credentials.get(function(err) {
…………後略
21
Ⓒ Classmethod, Inc.
Lambdavar aws = require('aws-sdk');
var kinesis = new aws.Kinesis({region:'us-east-1'});
var sqs = new aws.SQS({region:'us-east-1'});
exports.handler = function(event, context) {
for(i = 0; i < event.Records.length; ++i) {
encodedPayload = event.Records[i].kinesis.data;
payload = [ごにょごにょと変換処理]
}
var params = {
MessageBody: payload,
QueueUrl: 'https://sqs.us-east-1.amazonaws.com/xxxxxxxxxx/Demono9',
DelaySeconds: 0,
};
sqs.sendMessage(params, function(err, data) {
…………後略
22
Ⓒ Classmethod, Inc.
howler.js// Setup the sounds to be used.
var sound1 = new Howl({
src: ['Presto.m4a'],
html5: false
});
var playing = false;
// Define the tests to run.
var id;
var webaudio = [
function(fn) {
sound1.once('play', function() {
//label.innerHTML = 'PLAYING';
playing = true;
setTimeout(fn, 20000);
});
id = sound1.play();
sound1.pos(0,0,0);
…………後略
23
Ⓒ Classmethod, Inc.
LeapJS// Main Leap Loop
Leap.loop(options, function(frame) {
// Showcase some new V2 features
for (var i = 0, len = frame.hands.length; i < len; i++) {
hand = frame.hands[i];
for (var j = 0, len2 = hand.fingers.length; j < len2; j++) {
finger = hand.fingers[j];
if (i == 0 && j == 2 && playing){
x = Math.sin(finger.dipPosition[0] / 250);
y = -Math.cos(finger.dipPosition[0] / 250);
if (x > 1){
x = 1
}
if (y < -1){
y = -1;
}
sound1.pos(x,0,y);
start.style.marginLeft = Math.round(finger.dipPosition[0] * 3) + 'px';
sound1.volume(finger.dipPosition[1] / 400);
…………後略
24
Demo
25
Ⓒ Classmethod, Inc.
まとめクラスメソッドではハードウェアエンジニアを募集しております。
26
Ⓒ Classmethod, Inc.
#cmdevio
ご静聴ありがとうございました。 スライドは後日ブログで公開します。
27
DevIO MTUP11-SAPPORO-006