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