運用語音來控制無人機
進行語音識別部分開發的難點并不是識別本身,而是如何把語音流從運行在我本地服務器上的網頁里轉換成微軟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來讓無人機說話!
開發自主搜索路徑
我使用ardrone-autonomy庫來為無人機開發自主搜索路徑。在此過程中,我無數次地把無人機弄得撞到了客廳的家具和植物上。最后,我妻子很“客氣”地建議我去車庫里繼續我的項目,因為那里沒多少可以撞的東西。但是車庫的地方有點小,使得操控空間有限。

圖3:在我的“實驗室”里試飛無人機。圖片由Lukas Biewald授權使用
在我能有一個更大的實驗空間后,我會嘗試更智能的搜索算法。不過,現在我還是只會讓無人機做起飛和旋轉的動作,以此來搜索發現人,并識別是敵還是友。
var autonomy = require(‘ardrone-autonomy’);
var mission = autonomy.createMission({ip: ‘10.0.1.3’, frameRate: 1, imageSize: ‘640:320’});
console.log(“Here we go!”)
mission.takeoff()
.zero() // 把當前狀態作為參考基準
.altitude(1)
.taskSync(console.log(“Checkpoint 1”))
.go({x: 0, y: 0, z: 1, yaw: 90})
.taskSync(console.log(“Checkpoint 2”))
.hover(1000)
.go({x: 0, y: 0, z: 1, yaw: 180})
.taskSync(console.log(“Checkpoint 3”))
.hover(1000)
.go({x: 0, y: 0, z: 1, yaw: 270})
.taskSync(console.log(“Checkpoint 4”));
.hover(1000)
.go({x: 0, y: 0, z: 1, yaw: 0
.land()
全都搞定后的效果
看下面的視頻。我讓無人機起飛并去找我的朋友Chris:
結論
在一切都配置妥當之后,就可以通過API來控制無人機,獲得拍攝到的視頻圖片,這一切都爽爆了!隨著新的圖像識別技術可供使用,可能的應用必將越來越多。比如,讓無人機根據房屋平面圖來刷墻。雖然Parrot無人機并不是設計來為在狹小空間(比如我的房子)里安全飛行的,但隨著無人機越來越皮實,價格變得更低,我相信真正有用的應用將會進入爆發期。
微軟的認知服務云API是相當得好用且便宜。最初我比較擔心無人機所用的廣角攝像頭所拍攝的圖片會影響人臉識別的準確度,另外螺旋槳的噪聲可能會對語音識別產生干擾。但整體而言,這兩個API的表現遠超我的期望。同時處理延遲也低于我的預期。從架構設計角度來看,在云端運行機器學習實時圖像處理似乎是一個奇怪的選擇,但它可能會成為未來很多應用的架構選擇。
Lukas Biewald
Lukas Biewald是CrowdFlower的創始人兼CEO。CrowdFlower始于2009年,是一個數據增強的平臺,可以幫助企業獲得隨需的人力來收集、產生訓練數據,以及參與人-機器學習循環的工作。 在從斯坦福大學拿到數學學士和計算機科學碩士學位后,Lukas領導了雅虎日本的搜索相關團隊。隨后他去了Powerset,作為一個資深數據科學家進行工作。2008年Powerset被微軟收購。Lukas還被《公司》雜志評選為30位30歲以下的著名人士。 Lukas還是一位專家級的圍棋選手。