最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于樹莓派的語音機(jī)器人

 更新時間:2019年06月17日 09:11:24   作者:telrob  
這篇文章主要為大家詳細(xì)介紹了基于樹莓派的語音機(jī)器人,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

準(zhǔn)備工作:樹莓派,音頻模塊,stm32單片機(jī),百度語音識別接口,喇叭。

整體思路:

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

2. 通過http協(xié)議將組裝的語音文件上傳到百度語音識別平臺進(jìn)行識別。文檔說明(免費(fèi)調(diào)用)

3. 根據(jù)識別結(jié)果做出相應(yīng)的處理。

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

部分代碼:

將音頻轉(zhuǎn)換成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"
//gcc -o uart uart.c -lwiringPi
typedef struct WAV_Format WAVHEADER;
 
#define MAX_LISTEN_SIZES 1024*70 //定義接收數(shù)據(jù)的大小
#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!!!");
 
 //需要對音頻信號作出處理,當(dāng)大于或者閾值時開始統(tǒng)計,知道錄制完成
 int countTotal=0;
 int countNumber= 1000;//統(tǒng)計個數(shù)
 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");
 //對音頻進(jì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 */ 
 //返回數(shù)據(jù)賦值
 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);
 //發(fā)送請求
 free(lsn->data);
 free(lsn);
 int code=initToken();
 if(code==1)
 {
 char*token=getToken();
 ///開始創(chuàng)建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("你好,我是小志,有什么可以為你服務(wù)");
 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,"關(guān)閉燈,")!=NULL||strstr(text,"關(guān)閉,")!=NULL||strstr(text,"完畢,")!=NULL)
 {
 sayChina("好的");
 printf("正在關(guān)閉");
 ledOff();
 }
 if(strstr(text,"你叫什么")!=NULL||strstr(text,"你叫什么名字")!=NULL||strstr(text,"名字")!=NULL)
 {
 sayChina("我叫小志");
 }
 if(strstr(text,"今天天氣咋樣")!=NULL||strstr(text,"天氣")!=NULL)
 {
 sayChina("外面在下雨,有點(diǎn)冷");
 }
 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;
}

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

相關(guān)文章

  • 詳解C語言進(jìn)程同步機(jī)制

    詳解C語言進(jìn)程同步機(jī)制

    這篇文章主要介紹了詳解C語言進(jìn)程同步機(jī)制的的相關(guān)資料,文中代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • 一篇文章帶你了解C語言函數(shù)的可重入性

    一篇文章帶你了解C語言函數(shù)的可重入性

    這篇文章主要為大家詳細(xì)介紹了C語言函數(shù)的可重入性,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Linux下編譯C程序的過程

    Linux下編譯C程序的過程

    我們總是在Linux下輸入 gcc -o app main.c 即可編譯好程序,對于具體的詳細(xì)過程及流程,相信親們就不太了解啦!下面給大家展示一下C編譯器的解釋全過程。
    2016-01-01
  • C語言實現(xiàn)簡單猜數(shù)字游戲

    C語言實現(xiàn)簡單猜數(shù)字游戲

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)簡單猜數(shù)字游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 詳解C語言中symlink()函數(shù)和readlink()函數(shù)的使用

    詳解C語言中symlink()函數(shù)和readlink()函數(shù)的使用

    這篇文章主要介紹了詳解C語言中symlink()函數(shù)和readlink()函數(shù)的使用,是C語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • C語言中操作utmp文件的相關(guān)函數(shù)用法

    C語言中操作utmp文件的相關(guān)函數(shù)用法

    這篇文章主要介紹了C語言中操作utmp文件的相關(guān)函數(shù)用法,包括getutent()函數(shù)和setutent()函數(shù)以及endutent()函數(shù),需要的朋友可以參考下
    2015-08-08
  • 用C語言實現(xiàn)2048游戲

    用C語言實現(xiàn)2048游戲

    這篇文章主要為大家詳細(xì)介紹了用C語言實現(xiàn)2048游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C++ 中strcpy標(biāo)準(zhǔn)寫法實例詳解

    C++ 中strcpy標(biāo)準(zhǔn)寫法實例詳解

    這篇文章主要介紹了C++ 中strcpy標(biāo)準(zhǔn)寫法實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C語言進(jìn)階練習(xí)二叉樹的遞歸遍歷

    C語言進(jìn)階練習(xí)二叉樹的遞歸遍歷

    樹是一種重要的非線性數(shù)據(jù)結(jié)構(gòu),直觀地看,它是數(shù)據(jù)元素(在樹中稱為結(jié)點(diǎn))按分支關(guān)系組織起來的結(jié)構(gòu),很象自然界中的樹那樣。樹結(jié)構(gòu)在客觀世界中廣泛存在,如人類社會的族譜和各種社會組織機(jī)構(gòu)都可用樹形象表示,本篇介紹二叉樹的遞歸與非遞歸遍歷的方法
    2022-06-06
  • C++實現(xiàn)LeetCode(9.驗證回文數(shù)字)

    C++實現(xiàn)LeetCode(9.驗證回文數(shù)字)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(9.驗證回文數(shù)字),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07

最新評論

大同市| 新河县| 即墨市| 金秀| 雷州市| 临沂市| 富裕县| 河津市| 通道| 石屏县| 穆棱市| 温泉县| 炉霍县| 余姚市| 云浮市| 锡林浩特市| 玉屏| 荔波县| 行唐县| 泗洪县| 公安县| 古交市| 丰镇市| 仪征市| 三明市| 九江县| 当阳市| 湘乡市| 瓦房店市| 枣阳市| 定州市| 茂名市| 灌云县| 平山县| 新邵县| 治多县| 巴塘县| 青冈县| 开化县| 西充县| 长沙市|