一.GEC6818開(kāi)發(fā)板JPG圖像顯示
1.jpg圖片特性
體積小,使用到數(shù)據(jù)結(jié)構(gòu)里面的
霍夫曼樹(shù)(哈夫曼樹(shù))
對(duì)數(shù)據(jù)進(jìn)行壓縮
2.如何解壓縮jpg圖片
1.對(duì)jpegsrc.v8c.tar.gz進(jìn)行arm移植
移植方式如下:
1.將jpegsrc.v8c.tar.gz解壓縮到ubuntu ~
tar -zxvf jpegsrc.v8c.tar.gz -C ~ // -C 指定解壓縮的位置
2.進(jìn)入~/jpeg-8c對(duì)jpeg庫(kù)進(jìn)行配置
./configure --host=arm-linux --prefix=/home/gec/armJPegLib
--host=arm-linux : 指定編譯的環(huán)境,arm平臺(tái)
--prefix=/home/gec/armJPegLib : 指定動(dòng)態(tài)庫(kù)存放的路徑
3.編譯
make
4.安裝,將動(dòng)態(tài)庫(kù)存放到 /home/gec/armJPegLib
make install
5.清空編譯記錄
make clean
6.自己查看下 /home/gec/armJPegLib目錄下是否有4個(gè)目錄
bin include lib share
7.將圖片和程序下載到開(kāi)發(fā)板運(yùn)行即可
二.開(kāi)發(fā)板設(shè)置ip
// 臨時(shí)靜態(tài)設(shè)置ip設(shè)置,每次都需要設(shè)置
ifconfig eth0 192.168.24.xxx(自己分配的ip)
// 永久ip設(shè)置
vi /etc/profile
設(shè)置ip
ifconfig eth0 192.168.24.xxx(自己分配的ip)
參數(shù)如下:
ifconfig lo 127.0.0.1 up
ifconfig eth0 up
ifconfig eth0 192.168.24.xxx
保存退出,重啟開(kāi)發(fā)板
// 自動(dòng)獲取ip(慎重使用)
udhcpc
三.tftp使用
1.從飛秋下載tftp工具,解壓,打開(kāi)tftp32.exe
2.點(diǎn)擊瀏覽選擇需要下載的文件所對(duì)應(yīng)的目錄
3.在開(kāi)發(fā)板CRT軟件,執(zhí)行一下命令進(jìn)行下載程序
tftp 192.168.1.xxx -g -r main(需要下載的程序)
解釋:
192.168.1.xxx : 電腦主機(jī)ip,注意不是開(kāi)發(fā)板的ip
-g -r : 從電腦下載內(nèi)容到開(kāi)發(fā)板
-p -l : 將文件從開(kāi)發(fā)板上傳到電腦
四.運(yùn)行程序顯示圖片的時(shí)候遇到以下問(wèn)題
/main: error while loading shared libraries: libjpeg.so.8: cannot open shared object file: No such file or directory
將 libjpeg.so.8下載到開(kāi)發(fā)板的/lib
tftp 192.168.1.xxx -g -r libjpeg.so.8
cp libjpeg.so.8 /lib
五.禁用開(kāi)發(fā)板開(kāi)機(jī)自動(dòng)執(zhí)行原QT程序
vi /etc/profile
將以下兩行程序注釋
#cd /IOT
#./iot &
保存退出,重啟開(kāi)發(fā)板 reboot
六.科大訊飛離線語(yǔ)音識(shí)別包Linux_aitalk_exp1227_1398d7c6運(yùn)行demo程序
1.進(jìn)入Linux_aitalk_exp1227_1398d7c6/asr_offline_sample/asr_offline_sample
2.sudo cp Linux_aitalk_exp1227_1398d7c6/libs/x64/libmsc.so /lib 只需要拷貝一遍即可
3.編譯程序
./64_bitmake.sh
4.編譯后生成的可執(zhí)行程序存放在 Linux_aitalk_exp1227_1398d7c6/bin
5.進(jìn)入 Linux_aitalk_exp1227_1398d7c6/bin執(zhí)行asr_offline_sample程序
./asr_offline_sample
報(bào)錯(cuò)
./asr_offline_sample: error while loading shared libraries: libmsc.so: cannot open shared object file: No such file or directory
注意將
sudo cp Linux_aitalk_exp1227_1398d7c6/libs/x64/libmsc.so /lib
然后重新執(zhí)行程序即可
六.開(kāi)發(fā)板實(shí)現(xiàn)錄音
/alsa/bin --> arecord 錄音
/alsa/bin --> aplay 播放
alsa庫(kù)移植文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-798664.html
1.將alsa.tar.gz下載到開(kāi)發(fā)板并解壓到根目錄
tftp 192.168.24.xxx -g -r alsa.tar.gz
2.設(shè)置alsa庫(kù)環(huán)境變量
/etc/init.d/rcS 與 /etc/profile
#最大的區(qū)別就是,添加完環(huán)境變量以后不需要重啟開(kāi)發(fā)板,只需要執(zhí)行
source /etc/init.d/rcS # 即可
vi /etc/init.d/rcS
#添加以下內(nèi)容
export LD_LIBRARY_PATH=/alsa/lib:$LD_LIBRARY_PATH
export PATH=$PATH:/alsa/bin
3.生效該腳本文件
source /etc/init.d/rcS
4.查看環(huán)境變量有沒(méi)有alsa庫(kù)
env
5.指定ALSA庫(kù)的配置文件
將/alsa/share/alsa/拷貝到/usr/share/,方法如下:
cp /alsa/share/alsa/ /usr/share/ -r
將/alsa拷貝到/home/gec/,方法如下:
cp /alsa /home/gec/ -rf ---> 如果/home/gec不存在,則需要?jiǎng)?chuàng)建
6.在開(kāi)發(fā)板創(chuàng)建腳本 vi installAlsaNote.sh ,按i按鍵添加以下內(nèi)容,然后按:wq退出
mkdir /dev/snd
cd /dev/snd
mknod dsp c 14 3
mknod audio c 14 4
mknod mixer c 14 0
mknod controlC0 c 116 0
mknod seq c 116 1
mknod pcmC0D0c c 116 24
mknod pcmC0D0p c 116 16
mknod pcmC0D1c c 116 25
mknod pcmC0D1p c 116 17
mknod timer c 116 33
7.修改腳本權(quán)限
chmod 777 installAlsaNote.sh
8.運(yùn)行腳本,注意每次掉電后需要重新運(yùn)行
./installAlsaNote.sh
9.錄音
(注意錄音的時(shí)候不需要接耳機(jī),因?yàn)殚_(kāi)發(fā)板自帶有麥克風(fēng),麥克風(fēng)的位置在耳機(jī)口后面)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-798664.html
arecord -d3 -c1 -r16000 -twav -fS16_LE abc.wav
-d, --duration=# interrupt after # seconds ---> 錄音的秒數(shù)
-c, --channels=# channels ---> 音軌
-r, --rate=# sample rate ---> 采樣頻率
-t, --file-type TYPE file type (voc, wav, raw or au) ---> 封裝的格式
-f, --format=FORMAT sample format (case insensitive) ---> 量化位數(shù)
abc.wav : 是生成的錄音文件
10.播放音頻
aplay abc.wav
abc.wav : 是生成的錄音文件
源碼
asr_offline_sample.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "../../include/qisr.h"
#include "../../include/msp_cmn.h"
#include "../../include/msp_errors.h"
#define SAMPLE_RATE_16K (16000)
#define SAMPLE_RATE_8K (8000)
#define MAX_GRAMMARID_LEN (32)
#define MAX_PARAMS_LEN (1024)
const char * ASR_RES_PATH = "fo|res/asr/common.jet"; //離線語(yǔ)法識(shí)別資源路徑
const char * GRM_BUILD_PATH = "res/asr/GrmBuilld"; //構(gòu)建離線語(yǔ)法識(shí)別網(wǎng)絡(luò)生成數(shù)據(jù)保存路徑
const char * GRM_FILE = "call.bnf"; //構(gòu)建離線識(shí)別語(yǔ)法網(wǎng)絡(luò)所用的語(yǔ)法文件
const char * LEX_NAME = "contact"; //更新離線識(shí)別語(yǔ)法的contact槽(語(yǔ)法文件為此示例中使用的call.bnf)
typedef struct _UserData {
int build_fini; //標(biāo)識(shí)語(yǔ)法構(gòu)建是否完成
int update_fini; //標(biāo)識(shí)更新詞典是否完成
int errcode; //記錄語(yǔ)法構(gòu)建或更新詞典回調(diào)錯(cuò)誤碼
char grammar_id[MAX_GRAMMARID_LEN]; //保存語(yǔ)法構(gòu)建返回的語(yǔ)法ID
}UserData;
const char *get_audio_file(void); //選擇進(jìn)行離線語(yǔ)法識(shí)別的語(yǔ)音文件
int build_grammar(UserData *udata); //構(gòu)建離線識(shí)別語(yǔ)法網(wǎng)絡(luò)
int update_lexicon(UserData *udata); //更新離線識(shí)別語(yǔ)法詞典
int run_asr(UserData *udata); //進(jìn)行離線語(yǔ)法識(shí)別
const char* get_audio_file(void)
{
char key = 0;
while(key != 27) //按Esc則退出
{
printf("請(qǐng)選擇音頻文件:\n");
printf("1.打電話給丁偉\n");
printf("2.打電話給黃辣椒\n");
printf("3.打電話給奧巴馬\n");
key = getchar();
getchar();
switch(key)
{
case '1':
printf("\n1.打電話給丁偉\n");
return "wav/ddhgdw.pcm";
case '2':
printf("\n2.打電話給黃辣椒\n");
return "wav/ddhghlj.pcm";
case '3':
printf("\n3.打電話給奧巴馬\n");
return "wav/ddhgabm.pcm";
default:
continue;
}
}
exit(0);
return NULL;
}
int build_grm_cb(int ecode, const char *info, void *udata)
{
UserData *grm_data = (UserData *)udata;
if (NULL != grm_data) {
grm_data->build_fini = 1;
grm_data->errcode = ecode;
}
if (MSP_SUCCESS == ecode && NULL != info) {
printf("構(gòu)建語(yǔ)法成功! 語(yǔ)法ID:%s\n", info);
if (NULL != grm_data)
snprintf(grm_data->grammar_id, MAX_GRAMMARID_LEN - 1, info);
}
else
printf("構(gòu)建語(yǔ)法失??!%d\n", ecode);
return 0;
}
int build_grammar(UserData *udata)
{
FILE *grm_file = NULL;
char *grm_content = NULL;
unsigned int grm_cnt_len = 0;
char grm_build_params[MAX_PARAMS_LEN] = {NULL};
int ret = 0;
grm_file = fopen(GRM_FILE, "rb");
if(NULL == grm_file) {
printf("打開(kāi)\"%s\"文件失??![%s]\n", GRM_FILE, strerror(errno));
return -1;
}
fseek(grm_file, 0, SEEK_END);
grm_cnt_len = ftell(grm_file);
fseek(grm_file, 0, SEEK_SET);
grm_content = (char *)malloc(grm_cnt_len + 1);
if (NULL == grm_content)
{
printf("內(nèi)存分配失敗!\n");
fclose(grm_file);
grm_file = NULL;
return -1;
}
fread((void*)grm_content, 1, grm_cnt_len, grm_file);
grm_content[grm_cnt_len] = '\0';
fclose(grm_file);
grm_file = NULL;
snprintf(grm_build_params, MAX_PARAMS_LEN - 1,
"engine_type = local, \
asr_res_path = %s, sample_rate = %d, \
grm_build_path = %s, ",
ASR_RES_PATH,
SAMPLE_RATE_16K,
GRM_BUILD_PATH
);
ret = QISRBuildGrammar("bnf", grm_content, grm_cnt_len, grm_build_params, build_grm_cb, udata);
free(grm_content);
grm_content = NULL;
return ret;
}
int update_lex_cb(int ecode, const char *info, void *udata)
{
UserData *lex_data = (UserData *)udata;
if (NULL != lex_data) {
lex_data->update_fini = 1;
lex_data->errcode = ecode;
}
if (MSP_SUCCESS == ecode)
printf("更新詞典成功!\n");
else
printf("更新詞典失??!%d\n", ecode);
return 0;
}
int update_lexicon(UserData *udata)
{
const char *lex_content = "丁偉\n黃辣椒";
unsigned int lex_cnt_len = strlen(lex_content);
char update_lex_params[MAX_PARAMS_LEN] = {NULL};
snprintf(update_lex_params, MAX_PARAMS_LEN - 1,
"engine_type = local, text_encoding = UTF-8, \
asr_res_path = %s, sample_rate = %d, \
grm_build_path = %s, grammar_list = %s, ",
ASR_RES_PATH,
SAMPLE_RATE_16K,
GRM_BUILD_PATH,
udata->grammar_id);
return QISRUpdateLexicon(LEX_NAME, lex_content, lex_cnt_len, update_lex_params, update_lex_cb, udata);
}
int tcp_socket=0;
int new_socket=0;
void init_network()
{
//1.初始化網(wǎng)絡(luò)
tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
//2.綁定服務(wù)器
//設(shè)置鏈接的服務(wù)器地址信息
struct sockaddr_in addr;
addr.sin_family = AF_INET; //IPV4 協(xié)議
addr.sin_port = htons(50000); //端口
addr.sin_addr.s_addr = inet_addr("192.168.24.35"); //服務(wù)器的IP 地址
//解決端口復(fù)用
int on=1;
setsockopt(tcp_socket,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
on=1;
setsockopt(tcp_socket,SOL_SOCKET,SO_REUSEPORT,&on,sizeof(on));
//2.綁定服務(wù)器地址信息
int ret=bind(tcp_socket,(struct sockaddr *)&addr,sizeof(addr));
if(ret < 0)
{
perror("");
return 0;
}
else
{
printf("綁定成功\n");
}
//3.設(shè)置服務(wù)器為監(jiān)聽(tīng)模式
ret=listen(tcp_socket,5);
if(ret < 0)
{
perror("");
return 0;
}
else
{
printf("設(shè)置監(jiān)聽(tīng)成功\n");
}
//4.接收客戶端的鏈接請(qǐng)求
printf("等待服務(wù)器鏈接進(jìn)來(lái)\n");
new_socket=accept(tcp_socket,NULL,NULL);
if(new_socket < 0)
{
perror("");
return 0;
}
else
{
printf("鏈接成功?。n");
}
}
//設(shè)計(jì)一個(gè)從網(wǎng)絡(luò)獲取文件接口
char *get_network_file()
{
//進(jìn)行文件的接收
//1.新建文件
int new_fd=open("wav/cmd.pcm",O_RDWR|O_CREAT|O_TRUNC,0777);
int all_size=0;
while(1)
{
//讀取網(wǎng)絡(luò)數(shù)據(jù),寫(xiě)入到本地文件中
char buf[4096]={0};
int size = read(new_socket,buf,4096);
write(new_fd,buf,size);
all_size+= size;
if(all_size == 96000)
{
printf("接收文件完畢,開(kāi)始識(shí)別\n");
break;
}
}
//關(guān)閉所有打開(kāi)后的文件
close(new_fd);
return "wav/cmd.pcm";
}
int run_asr(UserData *udata)
{
char asr_params[MAX_PARAMS_LEN] = {NULL};
const char *rec_rslt = NULL;
const char *session_id = NULL;
const char *asr_audiof = NULL;
FILE *f_pcm = NULL;
char *pcm_data = NULL;
long pcm_count = 0;
long pcm_size = 0;
int last_audio = 0;
int aud_stat = MSP_AUDIO_SAMPLE_CONTINUE;
int ep_status = MSP_EP_LOOKING_FOR_SPEECH;
int rec_status = MSP_REC_STATUS_INCOMPLETE;
int rss_status = MSP_REC_STATUS_INCOMPLETE;
int errcode = -1;
//獲取識(shí)別的音頻文件
//asr_audiof = get_audio_file(); //主要修改這里,讓他去識(shí)別我們自己的音頻文件
asr_audiof = get_network_file(); //從網(wǎng)絡(luò)中獲取文件
f_pcm = fopen(asr_audiof, "rb");
if (NULL == f_pcm) {
printf("打開(kāi)\"%s\"失??![%s]\n", f_pcm, strerror(errno));
goto run_error;
}
//獲取音頻文件的大小,分配堆空間
fseek(f_pcm, 0, SEEK_END);
pcm_size = ftell(f_pcm);
fseek(f_pcm, 0, SEEK_SET);
pcm_data = (char *)malloc(pcm_size);
if (NULL == pcm_data)
goto run_error;
//把所有的音頻數(shù)據(jù),讀取到堆空間中
fread((void *)pcm_data, pcm_size, 1, f_pcm);
fclose(f_pcm);
f_pcm = NULL;
//離線語(yǔ)法識(shí)別參數(shù)設(shè)置
snprintf(asr_params, MAX_PARAMS_LEN - 1,
"engine_type = local, \
asr_res_path = %s, sample_rate = %d, \
grm_build_path = %s, local_grammar = %s, \
result_type = json, result_encoding = UTF-8, ",
ASR_RES_PATH,
SAMPLE_RATE_16K,
GRM_BUILD_PATH,
udata->grammar_id
);
session_id = QISRSessionBegin(NULL, asr_params, &errcode);
if (NULL == session_id)
goto run_error;
printf("開(kāi)始識(shí)別...\n");
while (1) {
unsigned int len = 6400;
if (pcm_size < 12800) {
len = pcm_size;
last_audio = 1;
}
aud_stat = MSP_AUDIO_SAMPLE_CONTINUE;
if (0 == pcm_count)
aud_stat = MSP_AUDIO_SAMPLE_FIRST;
if (len <= 0)
break;
printf(">");
fflush(stdout);
errcode = QISRAudioWrite(session_id, (const void *)&pcm_data[pcm_count], len, aud_stat, &ep_status, &rec_status);
if (MSP_SUCCESS != errcode)
goto run_error;
pcm_count += (long)len;
pcm_size -= (long)len;
//檢測(cè)到音頻結(jié)束
if (MSP_EP_AFTER_SPEECH == ep_status)
break;
usleep(150 * 1000); //模擬人說(shuō)話時(shí)間間隙
}
//主動(dòng)點(diǎn)擊音頻結(jié)束
QISRAudioWrite(session_id, (const void *)NULL, 0, MSP_AUDIO_SAMPLE_LAST, &ep_status, &rec_status);
free(pcm_data);
pcm_data = NULL;
//獲取識(shí)別結(jié)果
while (MSP_REC_STATUS_COMPLETE != rss_status && MSP_SUCCESS == errcode) {
rec_rslt = QISRGetResult(session_id, &rss_status, 0, &errcode);
usleep(150 * 1000);
}
printf("\n識(shí)別結(jié)束:\n");
printf("=============================================================\n");
if (NULL != rec_rslt)
{
printf("%s\n", rec_rslt);
//把結(jié)果回發(fā)給客戶端
write(new_socket,rec_rslt,strlen(rec_rslt));
}
else
printf("沒(méi)有識(shí)別結(jié)果!\n");
printf("=============================================================\n");
goto run_exit;
run_error:
if (NULL != pcm_data) {
free(pcm_data);
pcm_data = NULL;
}
if (NULL != f_pcm) {
fclose(f_pcm);
f_pcm = NULL;
}
run_exit:
QISRSessionEnd(session_id, NULL);
return errcode;
}
int main(int argc, char* argv[])
{
const char *login_config = "appid = 4a6e6f76"; //登錄參數(shù)
UserData asr_data;
int ret = 0 ;
char c;
//初始化網(wǎng)絡(luò)
init_network();
ret = MSPLogin(NULL, NULL, login_config); //第一個(gè)參數(shù)為用戶名,第二個(gè)參數(shù)為密碼,傳NULL即可,第三個(gè)參數(shù)是登錄參數(shù)
if (MSP_SUCCESS != ret) {
printf("登錄失?。?d\n", ret);
goto exit;
}
memset(&asr_data, 0, sizeof(UserData));
printf("構(gòu)建離線識(shí)別語(yǔ)法網(wǎng)絡(luò)...\n");
ret = build_grammar(&asr_data);
//第一次使用某語(yǔ)法進(jìn)行識(shí)別,需要先構(gòu)建語(yǔ)法網(wǎng)絡(luò),獲取語(yǔ)法ID,之后使用此語(yǔ)法進(jìn)行識(shí)別,無(wú)需再次構(gòu)建
if (MSP_SUCCESS != ret) {
printf("構(gòu)建語(yǔ)法調(diào)用失?。n");
goto exit;
}
while (1 != asr_data.build_fini)
usleep(300 * 1000);
if (MSP_SUCCESS != asr_data.errcode)
goto exit;
printf("離線識(shí)別語(yǔ)法網(wǎng)絡(luò)構(gòu)建完成,開(kāi)始識(shí)別...\n");
while(1) //不斷進(jìn)行識(shí)別
{
ret = run_asr(&asr_data);
if (MSP_SUCCESS != ret) {
printf("離線語(yǔ)法識(shí)別出錯(cuò): %d \n", ret);
goto exit;
}
}
exit:
MSPLogout();
return 0;
}
myhead.h
#ifndef _MYHEAD_H
#define _MYHEAD_H
#include <stdio.h>
#include <string.h>
#include <strings.h>
//#include <uniststat.h>
//#include <fcntld.h>
#include <fcntl.h>
#include <stdio.h> //printf scanf
#include <fcntl.h> //open write read lseek close
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <linux/input.h>
#include "jpeglib.h"
#define LCD_WIDTH 800
#define LCD_HEIGHT 480
#define FB_SIZE (LCD_WIDTH * LCD_HEIGHT * 4)
#define EN_LCD_SHOW_JPG 1
// 獲取觸摸屏坐標(biāo)
int ts(int *ts_x,int *ts_y);
// 顯示jpg圖片
int lcd_draw_jpg(unsigned int x,unsigned int y,const char *pjpg_path,char *pjpg_buf,unsigned int jpg_buf_size,unsigned int jpg_half);
#endif
Makefile
#common makefile header
DIR_INC = ../../include
DIR_BIN = ../../bin
DIR_LIB = ../../libs
TARGET = asr_offline_sample
BIN_TARGET = $(DIR_BIN)/$(TARGET)
CROSS_COMPILE =
CFLAGS = -g -Wall -I$(DIR_INC)
ifdef LINUX64
LDFLAGS := -L$(DIR_LIB)/x64
else
LDFLAGS := -L$(DIR_LIB)/x86
endif
LDFLAGS += -lmsc -lrt -ldl -lpthread -lstdc++
OBJECTS := $(patsubst %.c,%.o,$(wildcard *.c))
$(BIN_TARGET) : $(OBJECTS)
$(CROSS_COMPILE)gcc $(CFLAGS) $^ -o $@ $(LDFLAGS)
%.o : %.c
$(CROSS_COMPILE)gcc -c $(CFLAGS) $< -o $@
clean:
@rm -f *.o $(BIN_TARGET)
.PHONY:clean
#common makefile foot
到了這里,關(guān)于GEC6818開(kāi)發(fā)板JPG圖像顯示,科大訊飛離線語(yǔ)音識(shí)別包Linux_aitalk_exp1227_1398d7c6運(yùn)行demo程序,開(kāi)發(fā)板實(shí)現(xiàn)錄音的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!