本港台开奖现场直播 j2开奖直播报码现场
当前位置: 新闻频道 > IT新闻 >

码报:【j2开奖】语音控制+人脸识别——二次开发 Parrot 无人机!(2)

时间:2016-11-22 05:32来源:天下彩论坛 作者:www.wzatv.cc 点击:
如果你按照我上面所说的一步一步地实验到这里,你的无人机肯定已经坠落过了——至少好几次。我已经无数次地把我的无人机的保护外壳给它粘回机身上

  如果你按照我上面所说的一步一步地实验到这里,你的无人机肯定已经坠落过了——至少好几次。我已经无数次地把我的无人机的保护外壳给它粘回机身上,直到它解体,随后我只好再买了一个新的。我不得不说,其实 Parrot AR.Drone 型在没有保护外壳的时候飞行得更好。但这种方式会使无人机变得很危险。因为没有保护外壳的话,一旦无人机撞到东西,它的螺旋桨就会直接打到物体上,并留下刮痕。

  - 从网页上控制无人机飞行

  为无人机开发一个基于网页的控制页面挺简单且效果不错。用如下所示的 express.js 框架就可以搭建一个很小巧的网页服务器。

  var express = require(‘express’);

  app.get(‘/’, function (req, res) {

  res.sendFile(path.join(__dirname + ‘/index.html’));

  });

  app.get(‘/land’, function(req, res) {

  client.land();

  });

  app.get(‘/takeoff’, function(req, res) {

  client.takeoff();

  });

  app.listen(3000, function () {

  });

  我用下面的代来通过一个按钮发送 AJAX 请求。

  Takeoff

  Land

  - 从无人机上导出视频流

  我发现把无人机上的摄像头拍摄的视频导出的方法就是:建立一个持续的连接,并把摄像头拍摄的 PNG 图片发送到我的网站的网页上。通过使用 AR.Drone 无人机的库(见下面的代码),网页服务器不断地把无人机摄像头拍摄的 PNG 画面拉取出来。

  var pngStream = client.getPngStream();

  pngStream

  .on(‘error’, console.log)

  .on(‘data’, function(pngBuffer) {

  sendPng(pngBuffer);

  }

  function sendPng(buffer) {

  res.write(‘–daboundary\nContent-Type: image/png\nContent-length: ‘ + buff

  er.length + ‘\n\n’);

  res.write(buffer);

  });

  - 对从无人机获取的图像进行人脸识别

  微软的 Azure Face API 系统很容易上手,且功能强大。你上传你朋友的照片给它,这个系统就能识别出他们是谁。它也能猜测人物的年龄和性别。我发现这两个功能的识别准确率是惊人的高。整个识别的延迟大概是200毫秒。识别1000次请求花费1.5美元。对我而言,这个价格对于这种应用是相当合理的。下面是我的代码,它实现了发送图片给 API 来做人脸识别的功能。

  var oxford = require(‘project-oxford’),

  oxc = new oxford.Client(CLIENT_KEY);

  loadFaces = function() {

  chris_url = “https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAALyAJGMyNmIzNWM0LTA5MTYtNDU4Mi05YjExLTgyMzVlMTZjYjEwYw.jpg”;

  lukas_url = “https://media.licdn.com/mpr/mpr/shrinknp_400_400/p/3/000/058/147/34969d0.jpg”;

  oxc.face.faceList.create(‘myFaces’);

  oxc.face.faceList.addFace(‘myFaces’, {url => chris_url, name=> ‘Chris’});

  oxc.face.faceList.addFace(‘myFaces’, {url => lukas_url, name=> ‘Lukas’});

  }

  oxc.face.detect({

  path: ‘camera.png’,

  analyzesAge: true,

  analyzesGender: true

  }).then(function (response) {

  if (response.length > 0) {

  drawFaces(response, filename)

  }

  });

  我用了 ImageMagick 库来对我收集的PNG图片做打标签,效果相当好。对于这个部分其实可以有很多的扩展可能。比如用一个情感 API 来识别人脸所表现出来的情感。

  - 运用语音来控制无人机

  进行语音识别部分开发的难点并不是识别本身,而是如何把语音流从运行在我本地服务器上的网页里转换成微软 Speech API 可以使用格式。下面的代码就是实现这个功能的。一旦你能把语音保存成单声道和以正确的采样频率采样后,这个语音识别 API 就能很方便地识别语音内容。这个 API 的花费是1000次请求4美元。对于业余应用来说,直播,基本相当于是免费了。

  RecordRTC 是一个很好的库,可以用来作为以网页为客户端的语音采集的新手入门的工具。在客户端,我就加入了保存语音文件的代码。

  app.post(‘/audio’, function(req, res) {

  var form = new formidable.IncomingForm();

  // 设定允许客户在一个请求里上传多个文件

  form.multiples = true;

  form.uploadDir = path.join(__dirname, ‘/uploads’);

  form.on(‘file’, function(field, file) {

  filename = “audio.wav”

  fs.rename(file.path, path.join(form.uploadDir, filename));

  });

  // 记录发生的错误日志

  form.on(‘error’, function(err) {

  console.log(‘An error has occured: \n’ + err);

  });

  // 一旦所有文件上传完成,才给客户端发相应

  form.on(‘end’, function() {

  res.end(‘success’);

  });

  // 解析出请求里包含的表单数据

  form.parse(req)

  speech.parseWav(‘uploads/audio.wav’, function(text) {

  console.log(text);

  controlDrone(text);

  });

  });

  我使用 FFmpeg 工具来降低音频的采样率,并把多声道合并成单声道,以供微软 API 使用。

  exports.parseWav = function(wavPath, callback) {

  var cmd = ‘ffmpeg -i ‘ + wavPath + ‘ -ar 8000 -ac 1 -y tmp.wav’;

  exec(cmd, function(error, stdout, stderr) {

  console.log(stderr); // command output is in stdout

  });

  postToOxford(callback);

  });

  尽管我开发的功能就是这些,但是还是可以继续扩展。比如用微软的文字变语音的 API 来让无人机说话!

  - 开发自主搜索路径

(责任编辑:本港台直播)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
栏目列表
推荐内容