1. 前言
隨著物聯網的發展,語音識別技術受到越來越多的關注,語音識別技術正積極推動信息通信領域的革命,語音撥號,語音郵件,語音輸入乃至語音操控等以語音識別為基礎的人機交互日益普及.盡管生物識別方式不斷增多,語音識別方式仍是主流方式.與其他生物識別技術相比,語音識別技術不僅具有非接觸,非侵入性,使用方便,不會遺失和忘記,不需記憶等特點。
本篇文章就采用華為云提供的在線語音識別服務給瀏覽器設計一個語音自動搜索的功能,編程語言采用C++,軟件框架采用QT設計,瀏覽器內核采用QWebEngineView,在QT5.7以后,QT里就不支持webkit了,目前自帶的瀏覽器內核是QWebEngineView,只能使用MSVC編譯編譯,mingw要使用瀏覽器可以單獨下載webkit的庫,或者使用COM組件調用IE瀏覽器,當前文章里使用的瀏覽器是QWebEngineView,編譯器采用VS2017,32bit。
語音采集功能使用QT的QAudioInput類來實現,采集聲卡的PCM數據,保存起來,通過華為云的語音識別HTTP接口完成文字識別,得到文字后再通過瀏覽器進行搜索文字相關內容。
實現效果如下:
點擊界面上的 ”開始語音采集“按鈕,就可以說話,說完點擊停止采集,然后調用華為云的語音識別接口進行語音識別,在下面的顯示框上顯示識別到的文字,然后再完成瀏覽器自動搜索。
2. 創建語音服務器
2.1 使用語音服務
登錄華為云官網: https://www.huaweicloud.com/
短語音識別地址: https://www.huaweicloud.com/product/asr.html
短語音識別是將口述音頻轉換為文本,通過API調用識別不超過一分鐘的不同音頻源發來的音頻流或音頻文件。適用于語音搜索、人機交互等語音交互識別場景。 支持免費試用。
免費試用每日500次。
2.2 HTTP接口使用介紹
文檔地址: https://support.huaweicloud.com/api-sis/sis_03_0094.html
在線調試接口地址: https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=SIS&api=RecognizeShortAudio
幾個重要的參數:
本地音頻采集的頻率、通道數都得與參數匹配。
2.3 接口地址總結
請求地址: "https://{endpoint}/v1/{project_id}/asr/short-audio"
?
請求數據:
{
"config": {
"audio_format": "ulaw8k8bit",
"property": "chinese_8k_common",
"add_punc": "yes",
"digit_norm": "yes",
"need_word_info": "yes"
},
"data": "/+MgxAAUeHpMAUkQAANhuRAC..."
}
?
請求頭里要帶: X-Auth-Token 參數
請求數據里的參數在前面截圖里介紹了,data就是音頻文件的base64編碼數據。
請求地址里的endpoint字段、project_id字段、還有X-Auth-Token字段只要是訪問華為云的任何API接口都需要填,獲取方法看這里: https://bbs.huaweicloud.com/blogs/317759 翻到2.3小節。
識別成功返回的數據:
{
"trace_id": "567e8537-a89c-13c3-a882-826321939651",
"result": {
"text": "歡迎使用語音云服務。",
"score": 0.9,
"word_info": [
{
"start_time": 150,
"end_time": 570,
"word": "歡迎"
},
{
"start_time": 570,
"end_time": 990,
"word": "使用"
},
{
"start_time": 990,
"end_time": 1380,
"word": "語音"
},
{
"start_time": 1380,
"end_time": 1590,
"word": "云"
},
{
"start_time": 1590,
"end_time": 2070,
"word": "服務"
}
]
}
}
其中的text字段就是識別的文本數據。
3. 項目代碼示例
下面列出核心的代碼,主要是就是字符串拼接格式,拼接完發送http請求即可。
3.1 語音轉文字請求代碼
//語音轉文本
void Widget::audio_to_text(QByteArray data)
{
function_select=0;
?
QString requestUrl;
QNetworkRequest request;
?
//存放文件的BASE64編碼
QString base64_Data;
?
//設置請求地址
QUrl url;
?
//一句話識別的請求地址
requestUrl = QString("https://sis-ext.%1.myhuaweicloud.com/v1/%2/asr/short-audio")
.arg(SERVER_ID)
.arg(PROJECT_ID);
qDebug()< "requestUrl:"<
3.2 更新token代碼
/*
功能: 獲取token
*/
void Widget::GetToken()
{
//表示獲取token
function_select=3;
?
QString requestUrl;
QNetworkRequest request;
?
//設置請求地址
QUrl url;
?
//獲取token請求地址
requestUrl = QString("https://iam.%1.myhuaweicloud.com/v3/auth/tokens")
.arg(SERVER_ID);
?
//自己創建的TCP服務器,測試用
//requestUrl="http://10.0.0.6:8080";
?
//設置數據提交格式
request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json;charset=UTF-8"));
?
//構造請求
url.setUrl(requestUrl);
?
request.setUrl(url);
?
QString text =QString("{"auth":{"identity":{"methods":["password"],"password":"
"{"user":{"domain": {"
""name":"%1"},"name": "%2","password": "%3"}}},"
""scope":{"project":{"name":"%4"}}}}")
.arg(MAIN_USER)
.arg(IAM_USER)
.arg(IAM_PASSWORD)
.arg(SERVER_ID);
?
//發送請求
manager- >post(request, text.toUtf8());
}
3.3 華為云返回的結果處理
//解析反饋結果
void Widget::replyFinished(QNetworkReply *reply)
{
QString displayInfo;
int statusCode = reply- >attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
?
//讀取所有數據
QByteArray replyData = reply- >readAll();
?
qDebug()< "狀態碼:"<
審核編輯:湯梓紅
-
物聯網
+關注
關注
2909文章
44691瀏覽量
373836 -
AI
+關注
關注
87文章
30979瀏覽量
269252 -
語音識別
+關注
關注
38文章
1741瀏覽量
112683 -
瀏覽器
+關注
關注
1文章
1028瀏覽量
35381 -
華為云
+關注
關注
3文章
2555瀏覽量
17451
發布評論請先 登錄
相關推薦
評論