網(wǎng)上有很多關(guān)于pos機(jī)語(yǔ)音芯片,FastASR+FFmpeg的知識(shí),也有很多人為大家解答關(guān)于pos機(jī)語(yǔ)音芯片的問(wèn)題,今天pos機(jī)之家(www.tjfsxbj.com)為大家整理了關(guān)于這方面的知識(shí),讓我們一起來(lái)看下吧!
本文目錄一覽:
2、芯片銀行卡在POS機(jī)上怎么刷卡,能把步驟告訴我嗎
pos機(jī)語(yǔ)音芯片
一、音視頻處理基本梳理1.多媒體文件的理解1.1 結(jié)構(gòu)分析多媒體文件本質(zhì)上可以理解為一個(gè)容器容器里有很多流每種流是由不同編碼器編碼的在眾多包中包含著多個(gè)幀(幀在音視頻的處理中是最小單位)
1.2 封裝格式封裝格式(也叫容器) 就是將已經(jīng)編碼壓縮好的視頻流、音頻流及字幕流按照一定的方案放到一個(gè)文件中,便于播放軟件播放。一般來(lái)說(shuō),視頻文件的后綴就是它的封裝格式。封裝格式不一樣,后綴名也就不一樣(xxx.mp4 xxx.FLV)。
1.3 音視頻同步
Audio Master:同步視頻到音頻
Video Master: 同步音頻到視頻
External Clock Master: 同步音頻和視頻到外部時(shí)鐘
1.4 音視頻錄制原理
1.5 音視頻播放原理
1.6 音視頻播放原理
2.音視頻的基礎(chǔ)概念2.1 聲音對(duì)自然界的聲音進(jìn)行采樣,采樣就是在時(shí)間軸上對(duì)信號(hào)進(jìn)行數(shù)字化信號(hào),即按照一定時(shí)間間隔t在模擬信號(hào)x(t)上逐點(diǎn)采取其瞬時(shí)值。采樣率越高,聲音的還原程度越高,質(zhì)量就越好,同時(shí)占用空間會(huì)變大。
量化:用有限個(gè)幅度近似原來(lái)連續(xù)的幅度值把模擬信號(hào)的連續(xù)幅度變成有限數(shù)量的有一定間隔的離散值。【采樣值的精確度取決于它用多小位來(lái)表示,這就是量化。例如8位量化可以表示256個(gè)不同的值,而CD質(zhì)量的16位可以表示65536個(gè)值,范圍-32769-32767】
我們來(lái)算下這個(gè)值:
編碼:安裝一定的規(guī)律把量化后的值用二進(jìn)制數(shù)字表示,然后轉(zhuǎn)化成二值或多值的數(shù)字信號(hào)流。這樣得到的數(shù)字信號(hào)可以通過(guò)電纜,衛(wèi)星通信等數(shù)字線路傳輸。接收端與上述過(guò)程相反。
編碼如何理解:
我們?cè)趯W(xué)校上學(xué)的時(shí)候應(yīng)該聽(tīng)老師講過(guò)哈夫曼編碼,道理其實(shí)都一樣。采用某種形式將某個(gè)值變成唯一的,有效的編碼可以提高安全性、壓縮數(shù)據(jù)等有效功效。
PCM:上面數(shù)字化的過(guò)程又稱為脈沖編碼調(diào)制,通常我們說(shuō)音頻的裸數(shù)據(jù)格式就是脈沖編碼調(diào)制數(shù)據(jù)。描述一段PCM數(shù)據(jù)需要4量化指標(biāo):采樣率、位深度、字節(jié)序、聲道數(shù)。
采樣率:每秒鐘采樣多少次,以Hz為單位。
位深度(Bit-depth):表示用多小個(gè)二進(jìn)制位來(lái)描述采樣數(shù)據(jù),一般位16bit。
字節(jié)序:表示音頻PCM數(shù)據(jù)存儲(chǔ)的字節(jié)序是大端存儲(chǔ)還是小端存儲(chǔ),為了數(shù)據(jù)處理效率高效,通常采用小端存儲(chǔ)。
聲道數(shù)(channel number):當(dāng)前PCM文件中包含的聲道數(shù)是單聲道還是雙聲道
比特率:每秒傳輸?shù)腷it數(shù),單位為bps(Bit Per Second)。間接衡量聲音質(zhì)量的一個(gè)標(biāo)準(zhǔn)。沒(méi)有壓縮的音頻數(shù)據(jù)的比特率=采樣頻率*采樣精度*通道數(shù)。
碼率:壓縮后的音頻數(shù)據(jù)的比特率。碼率越大,壓縮效率越低,音質(zhì)越好,壓縮后數(shù)據(jù)越大。碼率=音頻文件大小/時(shí)長(zhǎng)。
幀:每次編碼的采樣單元數(shù)。比如MP3通常是1152個(gè)采樣點(diǎn)作為一個(gè)編碼單元,AAC通常是1024個(gè)采樣點(diǎn)作為一個(gè)編碼單元。
幀長(zhǎng):可以指每幀播放的持續(xù)時(shí)間。每幀持續(xù)時(shí)間(秒)=每幀采樣點(diǎn)數(shù)/采樣頻率(HZ)。也可以指壓縮后每幀的數(shù)據(jù)長(zhǎng)度。
音頻編碼:主要作用是將音頻采樣數(shù)據(jù)(PCM等)壓縮成為音頻碼流,從而降低音頻的數(shù)據(jù)量,偏于存儲(chǔ)和傳輸。
2.2圖像
圖像是客觀對(duì)象的一種相似性的、生動(dòng)性的描述或?qū)懻?,是人類社?huì)活動(dòng)中最常用的信息載體?;蛘哒f(shuō)圖像是客觀對(duì)象的一種表示,它包含了被描述對(duì)象的有關(guān)信息。它是人們最主要的信息源。
像素:屏幕顯示是把有效面積化為很多個(gè)小格子,每個(gè)格子只顯示一種顏色,是成像的最小元素,因此就叫做"像素"。
分辨率:屏幕在長(zhǎng)度和寬度這兩個(gè)方向上各有多少個(gè)像素,就叫做分辨率,一般用A x B來(lái)表示。分辨率越高,每個(gè)像素的面積越小,顯示效果就越平滑細(xì)膩。
RGB表示圖像:8bit表示一個(gè)子像素: 取值范圍[0~255] 或者 [00~FF]。例如圖像格式RGBA_8888,表示4個(gè)8bit表示一個(gè)像素,而RGB_565用5+6+5bit表示一個(gè)像素。一張1280*720的RGBA_8888格式的圖片大小=1280 x 720 x 32bit。所以每一張圖像的裸數(shù)據(jù)都是很大的。一部90分鐘的電影,沒(méi)秒25幀: 90 * 60 * 25 * 1280 * 720 * 32 bit = 463.48G。
YUV表示圖像:YUV,是另外一種顏色編碼方法,視頻的裸數(shù)據(jù)一般使用 YUV 數(shù)據(jù)格式表示。Y 表示明亮度,也稱灰度 值(灰階值)。UY 表示色度,均表示影響的色彩和飽和度,用于指定像素的顏色。
亮度:需要透過(guò) RGB 輸入信號(hào)建立,方式為將 RGB 信號(hào)的特定部分(g 分量信號(hào))疊加到一起。
色度:定義了顏色的色調(diào)和飽和度,分別用 Cr、Cb 表示,(C 代表分量(是 component 的縮寫(xiě)))。Cr 反映 RGB 輸入信號(hào)紅色部分與 RGB 信號(hào)亮度值之間的差異。Cb 反映 RGB 輸入信號(hào)藍(lán)色部分與 RGB 信號(hào)亮度值之間的差異。
2.3視頻
由于人類眼睛的特殊結(jié)構(gòu),畫(huà)面快速切換時(shí),畫(huà)面會(huì)有殘留( 視覺(jué)暫留),感覺(jué)起來(lái)就是連貫的動(dòng)作。所以 ,視頻就是由一系列圖片構(gòu)成的。
視頻碼率:指視頻文件在單位時(shí)間內(nèi)使用的數(shù)據(jù)流量,也叫碼流率。碼率越大,說(shuō)明單位時(shí)間內(nèi)取樣率越大,數(shù)據(jù)流精度就越高。
視頻幀率:通常說(shuō)一個(gè)視頻的25幀,指的就是這個(gè)視頻幀率,即1秒中會(huì)顯示25幀。幀率越高,給人的視覺(jué)就越流暢。
視頻分辨率:分辨率就是我們常說(shuō)的640x480分辨率、1920x1080分辨率,分辨率影響視頻圖像的大小。
幀:幀不需要參考其他畫(huà)面而生成,解碼時(shí)僅靠自己就重構(gòu)完整圖像。
視頻的編碼:編碼的目的就是為了壓縮, 讓各種視頻的體積變得更小,有利于存儲(chǔ)和傳輸。國(guó)際上主流制定視頻編解碼技術(shù)的組織有兩個(gè),一個(gè)是“國(guó)際電聯(lián)(ITU-T)”,它制定的標(biāo)準(zhǔn) 有 H.261、H.263、H.263+、H.264 等,另一個(gè)是“國(guó)際標(biāo)準(zhǔn)化組織(ISO)”它制定的標(biāo)準(zhǔn)有 MPEG-1、MPEG-2、 MPEG-4 等。
相關(guān)學(xué)習(xí)資料推薦,點(diǎn)擊下方鏈接免費(fèi)報(bào)名,先碼住不迷路~】
音視頻免費(fèi)學(xué)習(xí)地址:ffmpeg/WebRTC/RTMP/NDK/Android音視頻流媒體高級(jí)開(kāi)發(fā)
【免費(fèi)分享】音視頻學(xué)習(xí)資料包、大廠面試題、技術(shù)視頻和學(xué)習(xí)路線圖,資料包括(C/C++,Linux,F(xiàn)Fmpeg webRTC RTMP hls rtsp ffplay srs 等等)有需要的可以點(diǎn)擊788280672加群免費(fèi)領(lǐng)取~
3.常用的音視頻處理第三方庫(kù)
3.2.1基本概念
FFmpeg(Fast Forward MPEG)是全球領(lǐng)先的多媒體框架,能夠解碼(decode)、編碼(encode)、轉(zhuǎn)碼(transcode)、復(fù)用(mux)、解復(fù)用(demux)、流化(stream)、濾波(filter)和播放幾乎人類和機(jī)器創(chuàng)造的所有多媒體文件。
3.2.2 FFmpeg 的主要基本組成
FFmpeg的封裝模塊AVFormat:AVFormat實(shí)現(xiàn)了多媒體領(lǐng)域絕大數(shù)媒體封裝格式,包括封裝和解封裝,如MP4、FLV、KV、 TS等文件封裝格式,RTMP、RTSP、MMS、HLS等網(wǎng)絡(luò)協(xié)議封裝格式。FFmepg是否支持某種媒體封裝格式取決于編譯時(shí)是否包含了該格式的封裝庫(kù)。
FFmpeg的編解碼模塊AVCodec:AVCodec包括大多數(shù)常用的編解碼格式,既支持編碼也支持解碼。除了支持MPEG4、AAC、MJPEG等自帶的媒體格式也支持H.264(x264編碼器)、H.265(X265編碼器)、MP3(libMP3lame編碼器)
FFmepg的濾鏡模塊AVFilter:AVFilter庫(kù)提供了一個(gè)通用的音頻、視頻、字幕等濾鏡處理框架。在AVFilter中,濾鏡框架可以有多個(gè)輸入和多個(gè)輸出。
FFmpeg的視頻圖像轉(zhuǎn)換計(jì)算模塊swscale:swscale模塊提供了高級(jí)別的圖像轉(zhuǎn)換API,它能夠?qū)D像進(jìn)行縮放和像素格式轉(zhuǎn)換。
FFmpeg的音頻轉(zhuǎn)換計(jì)算模塊swresample:swresample提供了音頻重采樣API,支持音頻采樣、音頻通道布局、布局調(diào)整。
3.2.3 FFmpeg 的優(yōu)劣
高可移植性:可以在Linux、Mac、Windows等系統(tǒng)上編譯、運(yùn)行以及通過(guò)FATE(FFMPEG自動(dòng)化測(cè)試環(huán)境)測(cè)試。
高性能:專門(mén)針對(duì)X86、arm、MIPS、ppc等大多數(shù)主流的處理器提供了對(duì)應(yīng)的匯編級(jí)的優(yōu)化實(shí)現(xiàn)。
高度安全: FFMPEG官方對(duì)代碼審查總是考慮安全性,而且一旦發(fā)布的版本中有安全性的Bug都會(huì)盡快的修復(fù)并更新發(fā)布版本。
高度易用性:FFMPEG提供的API都有相關(guān)的注釋,且官方也有對(duì)應(yīng)的說(shuō)明文檔
支持的格式多樣性:FFMPEG支持很多媒體格式的解碼、編碼、復(fù)用、解復(fù)用等功能,不管是很老的格式,還是比較新的格式均有不錯(cuò)的支持
無(wú)法識(shí)別有空格的文件名
FFMPEG編碼時(shí),時(shí)間戳只需要指定AVFrame的pts字段
3.2.4 FFmpeg的安裝配置
3.2.5 FFmpeg的命令行使用
二、視頻中提取音頻1.FFmpeg通過(guò)命令行
ffmpeg -i 視頻文件路徑 -vn 音頻文件全路徑 -hide_banner
參數(shù)說(shuō)明
-vn 從視頻中提取音頻
-ab 指定編碼比特率(一些常見(jiàn)的比特率 96k、128k、192k、256k、320k
-ar 采樣率(22050、441000、48000)
-ac 聲道數(shù)
-f 音頻格式(通常會(huì)自動(dòng)識(shí)別)
示例:
a
通過(guò)提供的API
bool AVInterface::extractAudio(const char* src, const char* dstDir){ if (NULL == src || NULL == dstDir){printf("Ffmpeg::extractAudio[ERROR]::無(wú)效參數(shù),請(qǐng)檢查文件路徑是否正確\");return false;} int ret = 0; // 預(yù)存原文件路徑const char* src_FileName = src; // 1.獲取媒體文件的全局上下文信息 // 1.1 定義 AVFormatContext 容器AVFormatContext* pFormatCtx = NULL; // AVFormatContext描述了一個(gè)媒體文件或者媒體流構(gòu)成的基本信息pFormatCtx = avformat_alloc_context(); // 為 pFormatCtx 申請(qǐng)內(nèi)存 // 1.2 打開(kāi)媒體文件,并且讀取媒體文件的頭信息放入pFormatCtx中ret = avformat_open_input(&pFormatCtx, src_fileName, NULL, NULL);if (ret < 0){printf("Ffmpeg::extractAudio[ERROR]::打開(kāi)媒體流文件失敗\");return false;} // 2.探測(cè)流出信息 // 2.1 探尋文件中是否存在信息流,如果存在則將多媒體文件信息流放到pFormatCtxret = avformat_find_stream_info(pFormatCtx, NULL);if (ret < 0){printf("Ffmpeg::extractAudio[ERROR]::文件中不存在信息流\");return false;} av_dump_format(pFormatCtx, 0, src_fileName, 0); // 打印封裝格式和流信息 // 2.2 查找文件信息流中是否存在音頻流(我們只需要提取音頻),并獲取到音頻流在信息流中的索引int audio_stream_index = -1;audio_stream_index = av_find_best_stream(pFormatCtx, AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0);if (-1 == audio_stream_index){printf("Ffmpeg::extractAudio[ERROR]::文件中不存在音頻流\");return false;} // 3.輸出容器的定義AVFormatContext* pFormatCtx_out = NULL; // 輸出格式的上下文信息 const AVOutputFormat* pFormatOut = NULL; // 輸出的封裝格式AVPacket packet; // 輸出文件路徑char szFilename[256] = { 0 };snprintf(szFilename, sizeof(szFilename), "%s/ffmpeg-music.aac", dstDir); // 3.1 初始化容器 // 初始化一些基礎(chǔ)的信息av_init_packet(&packet); // 給 pFormatCtx_out 動(dòng)態(tài)分配內(nèi)存,并且會(huì)根據(jù)文件名初始化一些基礎(chǔ)信息avformat_alloc_output_context2(&pFormatCtx_out, NULL, NULL, szFilename); // 得到封裝格式 AACpFormatOut = pFormatCtx_out->oformat; // 4.讀取音頻流,并且將輸入流的格式拷貝到輸出流的格式中for (int i = 0; i < pFormatCtx->nb_streams; ++i) // nb_streams 流的個(gè)數(shù){// 流的結(jié)構(gòu)體,封存了一些流相關(guān)的信息AVStream* out_stream = NULL; // 輸出流AVStream* in_stream = pFormatCtx->streams[i]; // 輸入流AVCodecParameters* in_codeper = in_stream->codecpar; // 編解碼器 // 只取音頻流if (in_codeper->codec_type == AVMEDIA_TYPE_AUDIO){// 建立輸出流out_stream = avformat_new_stream(pFormatCtx_out, NULL);if (NULL == out_stream){printf("Ffmpeg::extractAudio::[ERROR]建立輸出流失敗\");return false;} // 拷貝編碼參數(shù),如果需要轉(zhuǎn)碼請(qǐng)不要直接拷貝// 這里只需要做音頻的提取,對(duì)轉(zhuǎn)碼要求不高ret = avcodec_parameters_copy(out_stream->codecpar, in_codeper); // 將輸入流的編碼拷貝到輸出流if (ret < 0){printf("Ffmpeg::extractAudio::[ERROR]拷貝編碼失敗\");return false;} out_stream->codecpar->codec_tag = 0;break; // 拿到音頻流就可以直接退出循環(huán),這里我們只需要音頻流}} av_dump_format(pFormatCtx_out, 0, szFilename, 1); // 解復(fù)用器,如果沒(méi)有指定就使用pbif (!(pFormatCtx->flags & AVFMT_NOFILE)){ret = avio_open(&pFormatCtx_out->pb, szFilename, AVIO_FLAG_WRITE); // 讀寫(xiě)if (ret < 0){printf("Ffmpeg::extractAudio::[ERROR]創(chuàng)建AVIOContext對(duì)象:打開(kāi)文件失敗\");return false;}}// 寫(xiě)入媒體文件頭部ret = avformat_write_header(pFormatCtx_out, NULL);if (ret < 0){printf("Ffmpeg::extractAudio::[ERROR]寫(xiě)入媒體頭部失敗\");return false;} // 逐幀提取音頻AVPacket* pkt = av_packet_alloc();while (av_read_frame(pFormatCtx, &packet) >=0 ){AVStream* in_stream = NULL;AVStream* out_stream = NULL;in_stream = pFormatCtx->streams[pkt->stream_index];out_stream = pFormatCtx_out->streams[pkt->stream_index]; if (packet.stream_index == audio_stream_index){ packet.pts = av_rescale_q_rnd(packet.pts, in_stream->time_base, out_stream->time_base, (AVRounding)(AV_ROUND_INF|AV_ROUND_PASS_MINMAX));packet.dts = packet.pts;packet.duration = av_rescale_q(packet.duration, in_stream->time_base, out_stream->time_base);packet.pos = -1;packet.stream_index = 0; // 將包寫(xiě)到輸出媒體文件av_interleaved_write_frame(pFormatCtx_out, &packet);// 減少引用計(jì)數(shù),防止造成內(nèi)存泄漏av_packet_unref(&packet);}} // 寫(xiě)入尾部信息av_write_trailer(pFormatCtx_out); // 釋放av_packet_free(&pkt);avio_close(pFormatCtx_out->pb);avformat_close_input(&pFormatCtx); return true;}
3.性能對(duì)比
三、視頻文件中提取圖片1.FFmpeg通過(guò)命令行
ffmpeg -i 視頻文件名 -r 幀率 -f 輸出格式 輸出文件名
示例: ffmpeg -i video.mp4 -r 1 -f image2 image-=.png
參數(shù)說(shuō)明:
-r 幀率(一秒內(nèi)導(dǎo)出多少?gòu)垐D像,默認(rèn)25)
-f 代表輸出格式(image2實(shí)際上是image2序列的意思)
示例:
通過(guò)提供的API
bool AVInterface::extracPictrue(const char* src, const char* dstDir, int num){ if(NULL == src || NULL == dstDir) { printf("Ffmpeg::extracPictrue[ERROR]::無(wú)效參數(shù),請(qǐng)檢查文件路徑是否正確\"); return false; } int ret = 0; // 預(yù)存原文件路徑 const char* src_fileName = src; // 1.獲取媒體文件的全局上下文信息 // 1.1 定義 AVFormatContext 容器 AVFormatContext* pFormatCtx = NULL; // AVFormatContext描述了一個(gè)媒體文件或者媒體流構(gòu)成的基本信息 pFormatCtx = avformat_alloc_context(); // 為pFormatCtx申請(qǐng)內(nèi)存 // 1.2 打開(kāi)媒體文件,并且讀取媒體文件的頭信息放入pFormatCtx中 ret = avformat_open_input(&pFormatCtx, src_fileName, NULL, NULL); if(ret < 0) { printf("Ffmpeg::extracPictrue[ERROR]::打開(kāi)媒體流文件失敗\"); return false; } // 2.探測(cè)流信息 // 2.1 探尋文件中是否存在信息流,如果存在則將多媒體文件信息流放到pFormatCtx中 ret = avformat_find_stream_info(pFormatCtx, NULL); if(ret < 0) { printf("Ffmpeg::extracPictrue[ERROR]::文件中不存在信息流\"); return false; } av_dump_format(pFormatCtx, 0, src_fileName, 0); // 可以打印查看 // 2.2 查找文件信息流中是否存在視頻流(這里我們需要提取圖片),并獲取到視頻流在信息流中的索引 int vecdio_stream_index = -1; vecdio_stream_index = av_find_best_stream(pFormatCtx, AVMEDIA_TYPE_VIDEO, -1, -1, NULL, 0); if(-1 == vecdio_stream_index) { printf("Ffmpeg::extracPictrue[ERROR]::文件中不存在視頻流\"); return false; } // ----------> 叢林方法1 // 3.找到對(duì)應(yīng)的解碼器:音視頻文件是壓縮之后的,我們要對(duì)文件內(nèi)容進(jìn)行處理,就必須先解碼 // 3.1 定義解碼器的容器 AVCodecContext* pCodeCtx = NULL; // AVCodecContext描述編解碼器的結(jié)構(gòu),包含了眾多解碼器的基本信息 const AVCodec* pCodec = NULL; // AVCodec 存儲(chǔ)解碼器的信息 pCodeCtx = avcodec_alloc_context3(NULL); // 初始化解碼器上下文 // 3.2 查找解碼器 AVStream* pStream = pFormatCtx->streams[vecdio_stream_index]; // 在眾多解碼器找到視頻處理的上下文信息 pCodec = avcodec_find_decoder(pStream->codecpar->codec_id); // 根據(jù)視頻流獲取視頻解碼器的基本信息 if(NULL == pCodec) { printf("未發(fā)現(xiàn)視頻編碼器\"); return false; } // 初始化解碼器上下文ret = avcodec_parameters_to_context(pCodeCtx, pStream->codecpar);if (ret < 0){printf("初始化解碼器上下文失敗\");return false;} // 3.3 打開(kāi)解碼器 ret = avcodec_open2(pCodeCtx, pCodec, NULL); if(ret < 0) { printf("無(wú)法打開(kāi)編解碼\"); return false; } AVFrame* pFrame = NULL;pFrame = av_frame_alloc();if (NULL == pFrame){printf("av_frame_alloc is error\");return false;} int index = 0; AVPacket avpkt; while (av_read_frame(pFormatCtx, &avpkt) >= 0){if (avpkt.stream_index == vecdio_stream_index){ret = avcodec_send_packet(pCodeCtx, &avpkt);if (ret < 0){continue;} while (avcodec_receive_frame(pCodeCtx, pFrame) == 0){SaveFramePicture(pFrame, dstDir, index);}index++; if (index == num){break;}} av_packet_unref(&avpkt);} avcodec_close(pCodeCtx); avformat_close_input(&pFormatCtx); return true; } bool AVInterface::SaveFramePicture(AVFrame* pFrame, const char* dstDir, int index){ char szFilename[256] = {0}; snprintf(szFilename, sizeof(szFilename), "%s/ffmpeg-%d.png", dstDir, index); int ret = 0; int width="360px",height="auto" />
3.性能對(duì)比
四、音頻文件中提取文字1.百度智能云語(yǔ)音識(shí)別1.1百度智能云的優(yōu)劣
1.2 百度智能云安裝配置
1.4百度智能云使用示例
SpeechRecognition開(kāi)源離線語(yǔ)音識(shí)別
SpeechRecognition,是google出的,專注于語(yǔ)音向文本的轉(zhuǎn)換。wit 和 apiai 提供了一些超出基本語(yǔ)音識(shí)別的內(nèi)置功能,如識(shí)別講話者意圖的自然語(yǔ)言處理功能。
SpeechRecognition的優(yōu)/劣
SpeechRecognition安裝配置
SpeechRecognition使用示例
FastASR語(yǔ)音識(shí)別
這是一個(gè)用C++實(shí)現(xiàn)ASR推理的項(xiàng)目,它的依賴很少,安裝也很簡(jiǎn)單,推理速度很快。支持的模型是由Google的Transformer模型中優(yōu)化而來(lái),數(shù)據(jù)集是開(kāi)源。Wennetspeech(1000+小時(shí))或阿里私有數(shù)據(jù)集(60000+小時(shí)),所以識(shí)別效果有很好,可以媲美許多商用的ASR軟件。
流式模型:模擬的輸入是語(yǔ)音流,并實(shí)時(shí)返回語(yǔ)音識(shí)別的結(jié)果,但是準(zhǔn)確率會(huì)降低些。
非流式模型:每次識(shí)別是以句子為單位,所以實(shí)時(shí)性會(huì)差一些,但是準(zhǔn)確率會(huì)高一些。
上面提到的這些模型都是基于深度學(xué)習(xí)框架(paddlepaddle和pytorch)實(shí)現(xiàn)的,本身的性能很不錯(cuò),在個(gè)人電腦上運(yùn)行,也能滿足實(shí)時(shí)性要求(時(shí)長(zhǎng)為10s的語(yǔ)言,推理視覺(jué)小于10s,即可滿足實(shí)時(shí)性)。
FastASR的優(yōu)/劣語(yǔ)言優(yōu)勢(shì):由于C++和Python不同,是編譯型語(yǔ)言,編譯器會(huì)根據(jù)編譯選項(xiàng)針對(duì)不同的平臺(tái)的CPU進(jìn)行優(yōu)化,更合適在不同CPU平臺(tái)上面部署,充分利用CPU的計(jì)算資源。
實(shí)現(xiàn)獨(dú)立:不依賴于現(xiàn)有的深度學(xué)習(xí)框架如pytorch、paddle、tensorflow等
依賴少:項(xiàng)目?jī)H使用了兩個(gè)第三方libfftw和libopenblas,并無(wú)其它依賴,所以在各個(gè)平臺(tái)的可以移植性很好,通用性很強(qiáng)。
缺少量化和壓縮模型支持C++ 和pythonFastASR安裝配置依賴安裝庫(kù) libfftw3sudo apt-get install libfftw3-dev libfftw3-single3
安裝依賴庫(kù) libopenblas
sudo apt-get install libopenblas-dev
安裝python環(huán)境
sudo apt-get install python3 python3-dev
下載最新版的源碼
git clone https://github.com/chenkui164/FastASR.git
編譯最新版本的源碼
cd FastASR/
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make
編譯python的whl安裝包
cd FastASRpython -m build
cd FastASRpython -m build
下載預(yù)訓(xùn)練模型
paraformer預(yù)訓(xùn)練模型下載
cd ../models/paraformer_cli
1.從modelscope官網(wǎng)下載預(yù)訓(xùn)練模型
wget --user-agent="Mozilla/5.0" -c "https://www.modelscope.cn/api/v1/models/damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch/repo?Revision=v1.0.4&FilePath=model.pb"
重命名
mv repo\\?Revision\\=v1.0.4\\&FilePath\\=model.pb model.pb
將用于Python的模型轉(zhuǎn)換為C++的
../scripts/paraformer_convert.py model.pb
通過(guò)md5檢查是否等于 c77bce5758ebdc28a9024460e48602
md5sum -b wenet_params.bin
K2_rnnt2預(yù)訓(xùn)練模型下載
cd ../models/k2_rnnt2_cli
1.從huggingface官網(wǎng)下載預(yù)訓(xùn)練模型
wget -c https://huggingface.co/luomingshuang/icefall_asr_wenetspeech_pruned_transducer_stateless2/resolve/main/exp/pretrained_epoch_10_avg_2.pt
2.將用于Python的模型轉(zhuǎn)換為C++的
../scripts/k2_rnnt2_convert.py pretrained_epoch_10_avg_2.pt
3.通過(guò)md5檢查是否等于 33a941f3c1a20a5adfb6f18006c11513
md5sum -b wenet_params.bin
PaddleSpeech預(yù)訓(xùn)練模型下載
1.從PaddleSpeech官網(wǎng)下載預(yù)訓(xùn)練模型
wget -c https://paddlespeech.bj.bcebos.com/s2t/wenetspeech/asr1_conformer_wenetspeech_ckpt_0.1.1.model.tar.gz
2.將壓縮包解壓wenetspeech目錄下
mkdir wenetspeech
tar -xzvf asr1_conformer_wenetspeech_ckpt_0.1.1.model.tar.gz -C wenetspeech
3.將用于Python的模型轉(zhuǎn)換為C++的
../scripts/paddlespeech_convert.py wenetspeech/exp/conformer/checkpoints/wenetspeech.pdparams
4.md5檢查是否等于 9cfcf11ee70cb9423528b1f66a87eafd
md5sum -b wenet_params.bin
流模式預(yù)訓(xùn)練模型下載
cd ../models/paddlespeech_stream
從PaddleSpeech官網(wǎng)下載預(yù)訓(xùn)練模型
wget -c https://paddlespeech.bj.bcebos.com/s2t/wenetspeech/asr1/asr1_chunk_conformer_wenetspeech_ckpt_1.0.0a.model.tar.gz
2.將壓縮包解壓wenetspeech目錄下
mkdir wenetspeech
tar -xzvf asr1_chunk_conformer_wenetspeech_ckpt_1.0.0a.model.tar.gz -C wenetspeech
3.將用于Python的模型轉(zhuǎn)化為C++的
../scripts/paddlespeech_convert.py wenetspeech/exp/chunk_conformer/checkpoints/avg_10.pdparams
4.md5檢查是否等于 367a285d43442ecfd9c9e5f5e1145b84
md5sum -b wenet_params.bin
FastASR使用示例
#include <iostream>#include <win_func.h>#include <Audio.h>#include <Model.h>#include <string.h> using namespace std; bool externContext(const char* src, const char* dst){ Audio audio(0); // 申請(qǐng)一個(gè)音頻處理的對(duì)象 audio.loadwav(src); // 加載文件 audio.disp(); // 分析格式 // Model* mm = create_model("/home/chen/FastASR/models/k2_rnnt2_cli", 2); // 創(chuàng)建一個(gè)預(yù)訓(xùn)練模型 Model* mm = create_model("/home/chen/FastASR/models/paraformer_cli", 3); audio.split(); // 解析文件 float* buff = NULL; // fftw3數(shù)據(jù)分析 int len = 0; int flag = false; char buf[1024]; // 一行一行的取出內(nèi)容 FILE* fp = NULL; fp = fopen(dst, "w+"); if(NULL == fp) { printf("打開(kāi)文件失敗\"); } printf("0.---------------------->\"); while(audio.fetch(buff, len , flag) > 0) { printf("1.---------------------->\"); mm->reset(); string msg = mm->forward(buff, len, flag); memset(buf, 0, sizeof(buf)); snprintf(buf, sizeof(buf), "%s", msg.c_str()); fseek(fp, 0, SEEK_END); fprintf(fp, "%s\", buf); fflush(fp); printf("2.--------------------->\"); } printf("3.------------------------>\"); return true; } int main(void){ externContext("./long.wav", "./Context.txt"); return 0;}
flags:= -I ./includeflags+= -L ./lib -lfastasr -lfftw3 -lfftw3f -lblas -lwebrtcvadsrc_cpp=$(wildcard ./*.cpp) debug:g++ -g $(src_cpp) -omain $(flags) -std=c++11
原文 FastASR+FFmpeg(音視頻開(kāi)發(fā)+語(yǔ)音識(shí)別)_ffmpeg語(yǔ)音識(shí)別_陳達(dá)書(shū)的博客-CSDN博客
芯片銀行卡在POS機(jī)上怎么刷卡,能把步驟告訴我嗎
dài芯片的銀行卡刷卡來(lái)自具體得看自己卡片的介質(zhì)類型來(lái)què定
芯片銀行卡按jiè質(zhì)類型劃分,分為純芯片卡和磁條芯片復(fù)合卡。chún芯片卡以芯片作為唯衣桿一交易jiè質(zhì),只能在具受有芯片讀取設(shè)備的受理少做收皮獨(dú)伯歷燃機(jī)南點(diǎn)使用,目前只有部分POS機(jī)和ATM機(jī)能受理
磁條芯片復(fù)合卡可同時(shí)支持芯片和磁條兩種介質(zhì),在可以受理芯片的受理點(diǎn)使用時(shí)讀取芯piàn,在其他受理點(diǎn)則讀取磁條,與傳統(tǒng)認(rèn)油跑cí條卡shǐ用范圍相同
以上就是關(guān)于pos機(jī)語(yǔ)音芯片,FastASR+FFmpeg的知識(shí),后面我們會(huì)繼續(xù)為大家整理關(guān)于pos機(jī)語(yǔ)音芯片的知識(shí),希望能夠幫助到大家!
