依圖語音API的C#封裝以及調用進行語音轉寫的處理

来源:https://www.cnblogs.com/wuhuacong/archive/2022/03/23/16038116.html
-Advertisement-
Play Games

對於語音識別,一般有實時語音識別和語音文件的識別處理等方式,如在會議、培訓等場景中,可以對錄製的文件進行文字的轉錄,對於轉錄文字的成功率來說,如果能夠轉換90%以上的正確語音內容,肯定能減輕很多相關語音文本編輯的繁瑣工作,而目前大多數語音轉錄的介面基本都能夠保證在這個成功率上,有些甚至超過98%以上... ...


對於語音識別,一般有實時語音識別和語音文件的識別處理等方式,如在會議、培訓等場景中,可以對錄製的文件進行文字的轉錄,對於轉錄文字的成功率來說,如果能夠轉換90%以上的正確語音內容,肯定能減輕很多相關語音文本編輯的繁瑣工作,而目前大多數語音轉錄的介面基本都能夠保證在這個成功率上,有些甚至超過98%以上,非常不錯,因為他們對於各種場景的濾波,可以更加提供文字的準確性。本篇隨筆對各種語音開發平臺做一個介紹,並針對依圖語音API的C#封裝以及調用進行語音轉寫進行介紹。

1、語音識別的介面提供商及API情況

語音識別有很多提供商,如常見的百度、阿裡雲、依圖語音等,他們都提供了不同的API介面來實現外部的調用處理,本篇隨筆主要針對依圖語音(號稱能夠識別99%以上的智能轉錄)進行測試,對於其他類型的語音API,由於介面處理方式大同小異,並沒有一一測試。

1)百度語音轉錄

2)阿裡雲語音轉錄

  

3)依雲語音開發平臺 

對於短語音的測試,依圖語音的轉錄基本上在98%以上,偶爾有一兩個詞語文字因為不常見而出錯而已,非常不錯。

由於依圖語音平臺雖然提供了Java的案例代碼,但是沒有對應C #API調用案例,因此需要根據介面的說明進行轉換。

對於依圖語音的API說明,還是介紹的比較詳細的,如下所示。

一般根據這些很容易編寫對應的介面API封裝函數,我這裡主要用來封裝對應的C#調用API。

 

2、基於依圖語音API的C#封裝

我們針對API進行了封裝,然後在界面上進行測試對應的功能,如下Winform界面測試所示。

一個短句,發現一個錯誤的字,不過整體效果還是比較好,斷句以及內容都算很好的。

這個項目分為三部分,第一是對請求介面數據和返回數據的對象封裝(簡稱DTO對象),第二是對依圖長語音和短語音介面的API介面封裝,包括授權信息的處理;長語音轉寫的任務創建、任務查詢、任務停止幾個部分;以及短語音的轉寫處理。第三是Winform界面的功能測試和日誌處理操作,方便瞭解功能的實際處理情況。

【創建長語音轉錄任務】主要用於演示如何生成簽名並調用介面創建轉寫任務的操作,操作後提示是否成功,並記錄下任務ID,供查詢任務或停止任務使用。同時在日誌和文本框裡面生成相關的JSON數據信息,日誌在運行目錄的log/log.txt中記錄。

 對於依圖語音轉換來說,我們一般使用非同步的處理方式,所以更好的是等待任務處理完後回調告訴我們處理結果更好,因此適合於部署Web API的應用,用於讓依圖語音平臺的伺服器進行回調處理結果。

 首先第一步我們需要處理API的授權簽名,用於後續介面的調用,我們可以根據簽名的規則進行編寫代碼即可。 

    /// <summary>
    /// 簽名處理
    /// </summary>
    public class SignatureHelper
    {
        /// <summary>
        /// 生成授權簽名信息
        /// </summary>
        /// <param name="data"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        public static string CalculateRFC2104HMAC(string data, string key)
        {
            key = key ?? "";
            var encoding = new System.Text.UTF8Encoding();
            byte[] keyByte = encoding.GetBytes(key);
            byte[] messageBytes = encoding.GetBytes(data);
            using (var hmacsha256 = new HMACSHA256(keyByte))
            {
                byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
                StringBuilder builder = new StringBuilder();
                for (int i = 0; i < hashmessage.Length; i++)
                {
                    builder.Append(hashmessage[i].ToString("x2"));
                }
                return builder.ToString();
            }
        }

        /// <summary>
        /// 生成請求授權信息
        /// </summary>
        /// <returns></returns>
        public static AuthRequestDto GetAuthDto()
        {
            var builder = new ConfigurationBuilder()
               .SetBasePath(Directory.GetCurrentDirectory())
               .AddJsonFile("appsettings.json", true, reloadOnChange: true);
            var config = builder.Build();

            //讀取配置
            var DevId = config["YITU:DevId"];
            var DevKey = config["YITU:DevKey"];

            var dto = new AuthRequestDto();
            dto.DevId = DevId;
            dto.Timestamp = DateTime.Now.DateTimeToInt();

            var accessKey = DevKey;
            var signKey = dto.DevId + dto.Timestamp; //簽名加密鍵
            dto.Signature = SignatureHelper.CalculateRFC2104HMAC(signKey, accessKey);

            return dto;
        }

        /// <summary>
        /// 對請求的HttpClient設置相關的授權請求Header信息
        /// </summary>
        /// <param name="client"></param>
        /// <param name="dto"></param>
        public static void SetSigature(HttpClient client, AuthRequestDto dto)
        {
            client.DefaultRequestHeaders.Add("x-dev-id", dto.DevId);
            client.DefaultRequestHeaders.Add("x-request-send-timestamp", dto.Timestamp.ToString());
            client.DefaultRequestHeaders.Add("x-signature", dto.Signature);

            client.DefaultRequestHeaders.Add("Date", DateTime.Now.AddHours(-8).ToString("R"));
        }
    }

 

 這個按鈕功能,主要測試一下使用輔助類生成的授權認證信息,授權認證信息是根據加密規則構建的簽名信息和賬號信息。

這個主要是演示輔助類生成簽名,並獲得的數據信息:

 然後我們定義一個控制器,用於接收依圖語音的伺服器API回調處理,用於記錄轉換的結果內容。

namespace CallBackApi.Controllers
{
    /// <summary>
    /// 用於接收長語音信息回調的處理
    /// </summary>
    [ApiController]
    [Route("[controller]")]
    public class LongVoiceController : ControllerBase

在控制器中編寫存儲的邏輯,寫入資料庫。

        /// <summary>
        /// 回調寫入結果, 路由:post /longvoice
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<CommonResultDto> CallBack(LongVoiceResultDto input)
        {
            CommonResultDto result = null;
            var json = JsonConvert.SerializeObject(input, Formatting.Indented);
            _logger.LogInformation(json);

            try
            {
                var helper = new LongVoiceDbHelper();
                var bResult = await helper.SaveData(input);
                result = new CommonResultDto(0, bResult ? "操作成功" : "操作失敗");
            }
            catch(Exception ex)
            {
                result = new CommonResultDto(1, ex.Message);
                _logger.LogError(ex, ex.Message);
            }

            return result;
        }

我們根據依圖語音的對象模型,構建對應的對象信息屬性,然後保存起來即可。

        /// <summary>
        /// 保存數據到資料庫
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        public async Task<bool> SaveData(LongVoiceResultDto dto)
        {
            bool result = false;
            if(dto != null)
            {
                using(var db = CreateDb())
                {
                    var info = new ConsultationInfo();
                    info.DiscernStatus = dto.taskId;
                    info.OperateStatus = "未識別";
                    if (dto.data != null && dto.data.speechResult != null)
                    {
                        if (dto.data.statusCode == 3)
                        {
                            info.OperateStatus = "已識別";
                        }
                        var speechResult = dto.data.speechResult;
                        info.DiscernText = speechResult.resultText;
                    }

                    result = await db.Insertable(info).ExecuteCommandAsync() > 0;
                }
            }
            return result;
        }

回調介面主要用於長語音任務執行完成後,伺服器的回調處理,我這裡使用.net core5的Web API項目來處理,通過使用Restful規則的API控制處理,接收伺服器的回調數據請求,並把請求數據記錄資料庫或者在log/log.txt文件中。

我們先發起語音轉錄請求,如下代碼所示。

       private LongVoiceRequestDto GetVoice1()
        { 
            var input = new LongVoiceRequestDto()
            {
                audioUrl = "https://www.***.com/downloads/iqidi.mp3", //語音文件
                callback = "http://www.***.com:8080/longvoice", //回調地址
                fileData = new FileData
                {
                    aue = "mpeg2",
                    audioName = "iqidi.mp3",
                    sampleRateHertz = 16000,
                    lang = "MANDARIN"
                },
                speechConfig = new SpeechConfig
                {
                    scene = "GENERAL",
                    byWords = true,
                    customWords = new List<string>()
                    {
                        //"開發框架提供商",
                        //"廣州愛奇迪軟體科技有限公司"
                    },
                    useCustomWordsIds = new List<int>()
                    {
                    },
                    addPunctuation = true,
                    wordsReplace = true,
                    numOfSpeakers = 1,
                    convertNumber = true,
                    //disfluency = true
                },
                wordsReplace = new List<WordsReplace>()
                {
                    new WordsReplace()
                    {
                         keywords = "他媽的",
                         replace = "*"
                    },
                    new WordsReplace()
                    {
                        keywords = "破壞",
                        replace = "##"
                    }
                }
            };
            return input;
        }

對於長語音的轉換,我們只是發起請求,有時候需要等待一點時間,伺服器才會根據請求的回調地址進行會寫操作的。發起長語音的請求如下代碼所示。

        private async void btnTransfer_Click(object sender, EventArgs e)
        {
            try
            {
                var input = this.radSmall.Checked ? GetVoice1() : GetVoice2();
                var result = await longApi.Transfer(input);
                if (result != null)
                {
                    this.txtTaskId.Text = result.taskId;//任務ID,可供查詢,停止
                    MessageUtil.ShowTips($"任務創建{(result.rtn == 0 ? "成功" : "異常:" + result.message)},任務ID:{result.taskId}");
                }

                var json = JsonConvert.SerializeObject(result, Formatting.Indented);
                this.richLog.AppendText(json);
                this.richLog.AppendText(Environment.NewLine);
                Serilog.Log.Information(json);
            }
            catch(Exception ex)
            {
                MessageUtil.ShowError(ex.Message);
            }
        }

回調介面主要用於長語音任務執行完成後,伺服器的回調處理。

而如果是短語音轉寫,就和我們前面說到的一樣,馬上就可以出結果了。

        private async void btnShort_Click(object sender, EventArgs e)
        {
            try
            {
                var input = GetShortVoice();
                var result = await shortApi.Transfer(input);
                if (result != null)
                {
                    MessageUtil.ShowTips($"短語音聽寫, 操作{(result.rtn == 0 ? "成功" : "異常:" + result.message)}");
                }

                var json = JsonConvert.SerializeObject(result, Formatting.Indented);
                this.richLog.AppendText(json);
                this.richLog.AppendText(Environment.NewLine);
                Serilog.Log.Information(json);
            }
            catch (Exception ex)
            {
                MessageUtil.ShowError(ex.Message);
            }
        }

我們只需要把返回的結果信息,轉換為相關的模型對象,然後進行顯示或者存儲即可完成。

項目可以通過VS發佈方式發佈一個文件包,部署到伺服器上即可。

配置項目後臺一直運行。

 

以上就是關於依圖語音的測試處理,對應後端的回調處理,我們可以轉錄長語音文件,不過依圖語音平臺對於身份的審核比較嚴格,也是收費的API(其他阿裡、百度也都是),因此在商用的時候,需要考慮好即可。

 

主要研究技術:代碼生成工具、會員管理系統、客戶關係管理軟體、病人資料管理軟體、Visio二次開發、酒店管理系統、倉庫管理系統等共用軟體開發
專註於Winform開發框架/混合式開發框架Web開發框架Bootstrap開發框架微信門戶開發框架的研究及應用
  轉載請註明出處:
撰寫人:伍華聰  http://www.iqidi.com 
    

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 先看一段代碼: int i = 0; int a = i++; sout("a的值是:"+i); sout("i的值是:"+i); 最終的編譯之後的核心位元組碼如下 L0 BITPUSH 0 //將常量0壓入操作棧 ISTORE_1 //將當前棧頂元素,彈出並保存到局部變數表的slot_1中 L1 I ...
  • 首先 每個人都會有一段特別懷念而又難忘的時光吧,我到現在依然記得大學時光的美好。讓我們一起來懷念一下時光吧。今天這個故事從一張校園卡開始,相信很多小伙伴們都用過校園卡,它是一種其個人身份認證、校園消費、數據共用等多功能於一體的校園信息集成與管理系統。在它裡面存儲著大量的數據,包含:學生消費、宿舍門禁 ...
  • OAuth2客戶端按照它們與授權伺服器進行安全認證的能力可以分為機密類型(Confidential)和公共類型(Public)。 機密類型的自身會有個密碼憑據,比如Web伺服器後端程式;而公共類型則沒有密碼憑據,純瀏覽器前端應用或者移動客戶端應用大都屬於這一種類型。不管是哪一種,它們都有客戶端ID( ...
  • 一、LinkedList集合特有的方法 方法名說明 public void addFirst(E e) 在該鏈表的頭部插入指定的元素 public void addLast(E e) 在該鏈表的尾部追加指定的元素 public E getLast() 返回此鏈表的最後一個元素 public E ge ...
  • 對於spring-security來說,當你訪問一個受保護資源時,需要檢查你的token,當沒有傳遞,或者傳遞的token有錯誤時,將出現401unauthorized異常;當你傳遞的token是有效的,但解析後並沒有訪問這個資源的許可權時,將返回403forbidden的異常,而你通過攔截器@Res ...
  • 最終版:07_中證網(Plus -Pro).py # coding=utf-8 import requests from bs4 import BeautifulSoup import io import sys import os sys.stdout = io.TextIOWrapper(sys ...
  • 上文,我們通過剖析一個最簡單的 Blazor WASM 項目,講明白了 Razor 文件是什麼,以及它被轉譯成 C#後長什麼樣子。也介紹了 Razor 中最簡單的一個語法:Razor Expression,也就是 Razor 表達式 本文將介紹兩個內容: 首先我們將書接上文,再介紹一丁點 Razor ...
  • 最近在做這個登錄功能介面,記錄一下 1、小程式端調用wx.login方法獲取code,後端使用WeChatAuth方法請求auth.code2Session介面使用appid、secret、js_code、grant_type:預設authorization_code獲取session_key、op ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...