運(yùn)用語音來控制無人機(jī)
進(jìn)行語音識(shí)別部分開發(fā)的難點(diǎn)并不是識(shí)別本身,而是如何把語音流從運(yùn)行在我本地服務(wù)器上的網(wǎng)頁里轉(zhuǎn)換成微軟Speech API可以使用格式。下面的代碼就是實(shí)現(xiàn)這個(gè)功能的。一旦你能把語音保存成單聲道和以正確的采樣頻率采樣后,這個(gè)語音識(shí)別API就能很方便地識(shí)別語音內(nèi)容。這個(gè)API的花費(fèi)是1000次請(qǐng)求4美元。對(duì)于業(yè)余應(yīng)用來說,基本相當(dāng)于是免費(fèi)了。
RecordRTC是一個(gè)很好的庫,可以用來作為以網(wǎng)頁為客戶端的語音采集的新手入門的工具。在客戶端,我就加入了保存語音文件的代碼。
app.post(‘/audio’, function(req, res) {
var form = new formidable.IncomingForm();
// 設(shè)定允許客戶在一個(gè)請(qǐng)求里上傳多個(gè)文件
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));
});
// 記錄發(fā)生的錯(cuò)誤日志
form.on(‘error’, function(err) {
console.log(‘An error has occured: \n’ + err);
});
// 一旦所有文件上傳完成,才給客戶端發(fā)相應(yīng)
form.on(‘end’, function() {
res.end(‘success’);
});
// 解析出請(qǐng)求里包含的表單數(shù)據(jù)
form.parse(req)
speech.parseWav(‘uploads/audio.wav’, function(text) {
console.log(text);
co
ntrolDrone(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
});
postToOxfor
d(callback);
});
盡管我開發(fā)的功能就是這些,但是還是可以繼續(xù)擴(kuò)展。比如用微軟的文字變語音的API來讓無人機(jī)說話!
開發(fā)自主搜索路徑
我使用ardrone-autonomy庫來為無人機(jī)開發(fā)自主搜索路徑。在此過程中,我無數(shù)次地把無人機(jī)弄得撞到了客廳的家具和植物上。最后,我妻子很“客氣”地建議我去車庫里繼續(xù)我的項(xiàng)目,因?yàn)槟抢餂]多少可以撞的東西。但是車庫的地方有點(diǎn)小,使得操控空間有限。
圖3:在我的“實(shí)驗(yàn)室”里試飛無人機(jī)。圖片由Lukas Biewald授權(quán)使用
在我能有一個(gè)更大的實(shí)驗(yàn)空間后,我會(huì)嘗試更智能的搜索算法。不過,現(xiàn)在我還是只會(huì)讓無人機(jī)做起飛和旋轉(zhuǎn)的動(dòng)作,以此來搜索發(fā)現(xiàn)人,并識(shí)別是敵還是友。
var auto
nomy = require(‘ardrone-autonomy’);
var mission = autonomy.createMission({ip: ‘10.0.1.3’, f
rameRate: 1, imageSize: ‘640:320’});
console.log(“Here we go!”)
mission.takeoff()
.zero() // 把當(dāng)前狀態(tài)作為參考基準(zhǔn)
.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()
全都搞定后的效果
看下面的視頻。我讓無人機(jī)起飛并去找我的朋友Chris:
結(jié)論
在一切都配置妥當(dāng)之后,就可以通過API來控制無人機(jī),獲得拍攝到的視頻圖片,這一切都爽爆了!隨著新的圖像識(shí)別技術(shù)可供使用,可能的應(yīng)用必將越來越多。比如,讓無人機(jī)根據(jù)房屋平面圖來刷墻。雖然Parrot無人機(jī)并不是設(shè)計(jì)來為在狹小空間(比如我的房子)里安全飛行的,但隨著無人機(jī)越來越皮實(shí),價(jià)格變得更低,我相信真正有用的應(yīng)用將會(huì)進(jìn)入爆發(fā)期。
微軟的認(rèn)知服務(wù)云API是相當(dāng)?shù)煤糜们冶阋?。最初我比較擔(dān)心無人機(jī)所用的廣角攝像頭所拍攝的圖片會(huì)影響人臉識(shí)別的準(zhǔn)確度,另外螺旋槳的噪聲可能會(huì)對(duì)語音識(shí)別產(chǎn)生干擾。但整體而言,這兩個(gè)API的表現(xiàn)遠(yuǎn)超我的期望。同時(shí)處理延遲也低于我的預(yù)期。從架構(gòu)設(shè)計(jì)角度來看,在云端運(yùn)行機(jī)器學(xué)習(xí)實(shí)時(shí)圖像處理似乎是一個(gè)奇怪的選擇,但它可能會(huì)成為未來很多應(yīng)用的架構(gòu)選擇。
Lukas Biewald
Lukas Biewald是CrowdFlower的創(chuàng)始人兼CEO。CrowdFlower始于2009年,是一個(gè)數(shù)據(jù)增強(qiáng)的平臺(tái),可以幫助企業(yè)獲得隨需的人力來收集、產(chǎn)生訓(xùn)練數(shù)據(jù),以及參與人-機(jī)器學(xué)習(xí)循環(huán)的工作。 在從斯坦福大學(xué)拿到數(shù)學(xué)學(xué)士和計(jì)算機(jī)科學(xué)碩士學(xué)位后,Lukas領(lǐng)導(dǎo)了雅虎日本的搜索相關(guān)團(tuán)隊(duì)。隨后他去了Powerset,作為一個(gè)資深數(shù)據(jù)科學(xué)家進(jìn)行工作。2008年P(guān)owerset被微軟收購。Lukas還被《公司》雜志評(píng)選為30位30歲以下的著名人士。 Lukas還是一位專家級(jí)的圍棋選手。
免責(zé)聲明:凡注明來源全球無人機(jī)網(wǎng)的所有作品,均為本網(wǎng)合法擁有版權(quán)或有權(quán)使用的作品,歡迎轉(zhuǎn)載,請(qǐng)注明出處。非本網(wǎng)作品均來自互聯(lián)網(wǎng),轉(zhuǎn)載目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé)。