亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

基于樹莓派的語音機器人

2020-01-26 13:26:42
字體:
來源:轉載
供稿:網友

近年來語音識別發展迅速也帶動了人工智能的發展。曾經渴望自己做一個機器人,但是無奈,心有余而力不足,經過多年的積累,小白的我也能用站著巨人的肩膀上玩下機器人了。

準備工作:樹莓派,音頻模塊,stm32單片機,百度語音識別接口,喇叭。

整體思路:

1. 由于樹莓派沒有ADC模塊,所以這里借助于stm32的ADC模塊來實現將語音信號轉換成數字信號,然后通過串口傳 輸 到樹莓派你中,樹莓派你將數據組裝成wave文件,便于語音識別。

2. 通過http協議將組裝的語音文件上傳到百度語音識別平臺進行識別。文檔說明(免費調用)

3. 根據識別結果做出相應的處理。

4. 對于需要播放語音時,根據百度語音合成接口合成語音然后使用mplayer播放出來。mplayer安裝參考 博客

部分代碼:

將音頻轉換成wave文件

#include <stdio.h>#include <stdlib.h>#include <stdint.h>#include <wiringPi.h>#include <wiringSerial.h> #include <unistd.h>#include <fcntl.h>#include <sys/types.h>#include <sys/ioctl.h>#include "listen.h"http://gcc -o uart uart.c -lwiringPitypedef struct WAV_Format WAVHEADER; #define MAX_LISTEN_SIZES 1024*70 //定義接收數據的大小#define bty 460800//串口的波特率struct listen*listenUart(){ int fd,file; char buff,buff2; struct listen*liste=(struct listen*)malloc(sizeof(struct listen));  unsigned short size; unsigned short*music,temp=0; unsigned short max=0,min=0; char*result=NULL;//存儲最后的返回值 int index=0,i=0; char stop=1; WAVHEADER wavHead; music=(unsigned short*)malloc(MAX_LISTEN_SIZES*2); result=(char*)malloc(MAX_LISTEN_SIZES*2+sizeof(WAVHEADER)); if(wiringPiSetup() < 0)return NULL; if((fd = serialOpen ("/dev/ttyAMA0",bty))<0) { return NULL;  printf("serial err/n"); } //file=open("abc.wav", O_RDWR|O_CREAT); printf("oepn success/n"); //serialPrintf(fd,"Hello World!!!");  //需要對音頻信號作出處理,當大于或者閾值時開始統計,知道錄制完成 int countTotal=0; int countNumber= 1000;//統計個數 int countMax=2860;//最大值 int countMin=2840;//最小值 int startCount=1; while(1) {  if(index==MAX_LISTEN_SIZES)  {  break;  }  buff=serialGetchar(fd);  buff2=serialGetchar(fd);  if((buff2&0x0F0)!=0)  {   buff2=serialGetchar(fd);  }  else  {   size=buff2;   size=size<<8;   size=(size&0xFF00)|(buff&0xFF);   music[index]=size;   if(startCount==1)   {   countTotal=countTotal+size;   if(index>=countNumber)   {    int temp=countTotal/(countNumber+1);    if(temp>countMax||temp<countMin)    {    startCount=0;    //開始錄音    printf(":::::%d/n",temp);    index++;    }    else    {    printf("temp:%d/n",temp);    index=0;    }    countTotal=0;   }   else   {    index++;   }   }   else   {    index++;   }  } } serialClose(fd); printf("end/n"); //對音頻進行放大處理 max=music[0]; min=music[0]; for(i=i;i<MAX_LISTEN_SIZES;i++){  temp=music[i];  if(temp>max)  {  max=temp;  }  if(temp<min)  {  min=temp;  } }  size=max-min;  for(i=0;i<MAX_LISTEN_SIZES;i++) {  music[i]=(unsigned short)((music[i]-min)*1.0*6000/size); } wavHead.ChunkID=0x46464952; /* "RIFF" */  wavHead.ChunkSize=sizeof(wavHead)+MAX_LISTEN_SIZES*2 -8; /* 36 + Subchunk2Size */  wavHead.Format=0x45564157; /* "WAVE" */  wavHead.Subchunk1ID=0x20746D66; /* "fmt " */  wavHead.Subchunk1Size=0x10; /* 16 for PCM */  wavHead.AudioFormat=0x01; /* PCM = 1*/  wavHead.NumChannels=0x01; /* Mono = 1, Stereo = 2, etc. */  wavHead.SampleRate=0x3E80; /* 8000, 44100, etc. */  wavHead.ByteRate=0x7D00; /* = SampleRate * NumChannels * BitsPerSample/8 */  wavHead.BlockAlign=0x02; /* = NumChannels * BitsPerSample/8 */   wavHead.BitsPerSample=0x10; /* 8bits, 16bits, etc. */  wavHead.Subchunk2ID=0x61746164; /* "data" */  wavHead.Subchunk2Size=MAX_LISTEN_SIZES*2; /* data size */  //返回數據賦值 memcpy(result,(char*)&wavHead,sizeof(WAVHEADER)); memcpy(result+sizeof(WAVHEADER),(char*)music,MAX_LISTEN_SIZES*2); liste->length=sizeof(WAVHEADER)+MAX_LISTEN_SIZES*2; liste->data=result; return liste;}

將音頻識別成文字

#include "convertText.h"static Buffer *listen_buff2=NULL;size_t listen_getData2(void *ptr, size_t size, size_t nmemb, void *stream) { appendBuffer(listen_buff2,ptr,nmemb); return nmemb;}int listenText(char*result2){ listen_buff2=initBuffer(); struct listen*lsn=listenUart(); char*base; int fileLength=lsn->length; int result=1; int baseSize=(lsn->length/3)*4+(lsn->length%3)*2+1; base=(char*)malloc(baseSize); base64_encode(lsn->data,lsn->length,base); //發送請求 free(lsn->data); free(lsn); int code=initToken(); if(code==1) { char*token=getToken(); ///開始創建json字符串 cJSON * root = cJSON_CreateObject(); cJSON_AddItemToObject(root, "format", cJSON_CreateString("wav")); cJSON_AddItemToObject(root, "rate", cJSON_CreateString("16000")); cJSON_AddItemToObject(root, "channel", cJSON_CreateString("1")); cJSON_AddItemToObject(root, "cuid", cJSON_CreateString("34-68-95-91-77-43")); cJSON_AddItemToObject(root, "token", cJSON_CreateString(token)); cJSON_AddItemToObject(root, "dev_pid", cJSON_CreateString("1537")); cJSON_AddItemToObject(root, "speech", cJSON_CreateString(base)); cJSON_AddItemToObject(root, "len", cJSON_CreateNumber(fileLength)); char*jsonParam=cJSON_PrintUnformatted(root);  char*apiurl="http://vop.baidu.com/server_api";  CURL* curl; CURLcode res;  // ptr = curl_easy_escape(NULL, (char *)a, asize);  curl = curl_easy_init(); struct curl_slist* headers = NULL; headers = curl_slist_append(headers, "Content-Type:application/json"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); curl_easy_setopt(curl, CURLOPT_URL, apiurl); curl_easy_setopt(curl, CURLOPT_TIMEOUT, 60);  curl_easy_setopt(curl, CURLOPT_POST, 1);  //http://vop.baidu.com/server_api  //CURLOPT_POSTFIELDS,CURLOPT_POSTFIELDSIZE  curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonParam);  curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, strlen(jsonParam)); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, listen_getData2); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); res = curl_easy_perform(curl);  curl_easy_cleanup(curl); cJSON_Delete(root);  curl_slist_free_all(headers); free(token); free(jsonParam); if (res == CURLE_OK)  { char*chars; char*tempresult=(char*)malloc(listen_buff2->length+1); memcpy(tempresult,listen_buff2->buff,listen_buff2->length); tempresult[listen_buff2->length]=0; cJSON *json; cJSON * item = NULL; cJSON*errCode;   json=cJSON_Parse(tempresult);   item=cJSON_GetObjectItem(json, "result"); errCode=cJSON_GetObjectItem(json, "err_no"); if(errCode->valueint!=0) {  return -3; } chars=cJSON_GetArrayItem(item,0)->valuestring; strcpy(result2,chars); free(tempresult); cJSON_Delete(json); return 0;  } else { return -3; }  } else { return -2; } return -1;}

主程序

#include<stdio.h> #include<string.h> #include "convertText.h"#include "mp3.h"#include "led.h"#include "say.h" //gcc -o robot robot.o mp3.o Buffer.o base64.o token.o cJSON.o listen.o convertText.o led.o say.o -lcurl -lm -lwiringPi -lmad void sayChina(char*china){ int resp=initSay(china); printf("resp:%d/n",resp); if(resp==1) { int tte=playData("temp.mp3"); printf("tte:%d/n",tte); }}int main(){ char text[100]={0}; sayChina("你好,我是小志,有什么可以為你服務"); while(1) { printf(";;;;;;;;"); int code= listenText(text); if(code==0) { printf("result:%s/n",text); if(strstr(text,"播放音樂,")!=NULL||strstr(text,"打開音樂,")!=NULL) { sayChina("正在為你打開音樂"); musicPlayFile("mu.mp3"); } if(strstr(text,"打開燈,")!=NULL||strstr(text,"打開,")!=NULL) { sayChina("好的"); printf("正在打開"); ledOn(); } if(strstr(text,"關閉燈,")!=NULL||strstr(text,"關閉,")!=NULL||strstr(text,"完畢,")!=NULL) { sayChina("好的"); printf("正在關閉"); ledOff(); } if(strstr(text,"你叫什么")!=NULL||strstr(text,"你叫什么名字")!=NULL||strstr(text,"名字")!=NULL) { sayChina("我叫小志"); } if(strstr(text,"今天天氣咋樣")!=NULL||strstr(text,"天氣")!=NULL) { sayChina("外面在下雨,有點冷"); } if(strstr(text,"中午好")!=NULL||strstr(text,"中午")!=NULL) { sayChina("好什么啊,我還沒吃飯呢"); } if(strstr(text,"你多大了")!=NULL||strstr(text,"今年幾歲")!=NULL||strstr(text,"幾歲")!=NULL) { sayChina("我才出生,還沒滿月"); } } else { printf("error/n"); } } return 0;}

這里只是貼出來部分程序,所有代碼請查看 鏈接 希望能和大家一起交流下心得。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本精品性网站在线观看| 日韩精品在线观| 欧美限制级电影在线观看| 91久久久久久久久久| 欧美成人三级视频网站| 国产精品久久不能| 国产精品一区久久| 97在线免费观看视频| 色综合色综合久久综合频道88| 欧美肥臀大乳一区二区免费视频| zzjj国产精品一区二区| 精品偷拍一区二区三区在线看| 神马久久久久久| 国产精品狼人色视频一区| 国产日韩精品在线| 久久91精品国产91久久跳| 国产精品露脸自拍| 日韩av在线资源| 欧美日韩视频在线| 久久理论片午夜琪琪电影网| 国产精品一区二区三区免费视频| 日韩在线观看视频免费| 狠狠久久亚洲欧美专区| 在线观看中文字幕亚洲| 精品福利在线视频| 欧美精品中文字幕一区| 日韩视频免费在线| 亚洲国产精品yw在线观看| 久久亚洲一区二区三区四区五区高| 欧美疯狂做受xxxx高潮| 中文字幕亚洲一区二区三区五十路| 久久99热这里只有精品国产| 国精产品一区一区三区有限在线| 狠狠色狠狠色综合日日小说| 美女999久久久精品视频| 成人精品aaaa网站| 国产精品揄拍500视频| 国产成人福利网站| 日本中文字幕久久看| 欧美日韩国产精品一区二区不卡中文| 国产精品久久婷婷六月丁香| 午夜精品99久久免费| 国产欧美精品久久久| 精品久久中文字幕久久av| 国产91网红主播在线观看| 91最新国产视频| 欧美综合国产精品久久丁香| 国产一区二区三区在线视频| xvideos亚洲人网站| 91精品视频在线看| 精品久久久久久中文字幕大豆网| 国产亚洲成av人片在线观看桃| 久久久久99精品久久久久| 欧美日韩不卡合集视频| 欧美激情第99页| 日日噜噜噜夜夜爽亚洲精品| 欧美高清视频一区二区| 欧美丰满老妇厨房牲生活| 九九热精品视频国产| 国产一区二区三区18| 久久久av网站| 国产亚洲精品成人av久久ww| 在线播放日韩专区| 久久精品国产欧美亚洲人人爽| 国内精品久久久久影院 日本资源| 国产99久久精品一区二区 夜夜躁日日躁| 国产主播在线一区| 精品国内亚洲在观看18黄| 日韩av一卡二卡| 欧美国产欧美亚洲国产日韩mv天天看完整| 2019亚洲日韩新视频| 91美女片黄在线观看游戏| 久久久久久久久久久国产| 最近2019年好看中文字幕视频| 亚洲国产成人av在线| 中文字幕日韩精品在线观看| 黑人巨大精品欧美一区二区三区| 亚洲国产精品电影| 欧美肥臀大乳一区二区免费视频| 国产精品久久久久久久久久久久久| 日韩免费在线播放| 国产精品久久久久久久久久久久| 国产伦精品一区二区三区精品视频| 亚洲精选一区二区| 奇米一区二区三区四区久久| 日韩电影中文字幕av| 91美女片黄在线观看游戏| 国产精品视频自在线| 福利视频第一区| 亚洲午夜av电影| 欧美日韩黄色大片| 欧美性生活大片免费观看网址| 色老头一区二区三区在线观看| 色与欲影视天天看综合网| 亚洲天堂网站在线观看视频| 亚洲欧美成人网| 在线观看精品国产视频| 欧美日韩成人在线视频| 久久精品国产免费观看| 欧美性猛交xxxx乱大交极品| 国产精品高清在线| 欧美大片免费观看| 高清欧美性猛交xxxx黑人猛交| 欧美精品久久久久久久| 国产欧美va欧美va香蕉在线| 久久人体大胆视频| 国产精品入口福利| 亚洲欧美成人精品| 欧美激情视频三区| 97热在线精品视频在线观看| 日韩精品视频在线观看免费| 欧美一区二区大胆人体摄影专业网站| 欧美日韩国产专区| 欧美精品久久久久a| 欧美日韩国产麻豆| 91在线网站视频| 国产精品视频久久| 色妞一区二区三区| 成人国产精品日本在线| 亚洲最大成人在线| 亚洲天堂男人的天堂| 亚洲天堂男人的天堂| 中文字幕在线精品| 91在线视频成人| 国产免费一区二区三区在线能观看| 亚洲视频视频在线| 波霸ol色综合久久| 久久久久久有精品国产| 亚洲精品久久久久中文字幕欢迎你| 国产欧美久久一区二区| 色综久久综合桃花网| 国产精品一香蕉国产线看观看| 78m国产成人精品视频| 国产精品嫩草影院久久久| 亚洲加勒比久久88色综合| 3344国产精品免费看| 91精品久久久久久久| 久久成人18免费网站| 久久久亚洲精选| 性欧美暴力猛交69hd| 久久久国产一区二区三区| 91在线观看免费网站| 精品亚洲aⅴ在线观看| 日韩免费黄色av| 国产午夜精品理论片a级探花| 成人免费淫片视频软件| 久久精品这里热有精品| 国产一区二区三区免费视频| 日韩久久免费视频| 在线观看欧美日韩| 亚洲欧美综合另类中字| 欧美激情一区二区三区成人| 成人黄色av免费在线观看| 久久人人爽人人爽人人片av高请| 久久久亚洲国产| 国产精品一区二区三区久久久| 成人综合国产精品| 国产精品精品一区二区三区午夜版| 国产免费一区二区三区在线观看| 国产日韩在线看片| 精品国产一区二区三区久久狼黑人| 亚洲人成电影网站色…| 在线看日韩av| 狠狠久久亚洲欧美专区|