国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

.Net 使用OpenAI開源語音識別模型Whisper

這篇具有很好參考價值的文章主要介紹了.Net 使用OpenAI開源語音識別模型Whisper。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

.Net 使用OpenAI開源語音識別模型 Whisper

前言

Open AI在2022年9月21日開源了號稱其英文語音辨識能力已達(dá)到人類水準(zhǔn)的 Whisper 神經(jīng)網(wǎng)絡(luò),且它亦支持其它98種語言的自動語音辨識。 Whisper系統(tǒng)所提供的自動語音辨識(Automatic Speech Recognition,ASR)模型是被訓(xùn)練來運行語音辨識與翻譯任務(wù)的,它們能將各種語言的語音變成文本,也能將這些文本翻譯成英文。

whisper的核心功能語音識別,對于大部分人來說,可以幫助我們更快捷的將會議、講座、課堂錄音整理成文字稿;對于影視愛好者,可以將無字幕的資源自動生成字幕,不用再苦苦等待各大字幕組的字幕資源;對于外語口語學(xué)習(xí)者,使用whisper翻譯你的發(fā)音練習(xí)錄音,可以很好的檢驗?zāi)愕目谡Z發(fā)音水平。 當(dāng)然,各大云平臺都提供語音識別服務(wù),但是基本都是聯(lián)網(wǎng)運行,個人隱私安全總是有隱患,而whisper完全不同,whisper完全在本地運行,無需聯(lián)網(wǎng),充分保障了個人隱私,且whisper識別準(zhǔn)確率相當(dāng)高。

Whisper是C++寫的,sandrohanea 對其進(jìn)行了.Net封裝。

本文旨在梳理我在.net web 項目中使用開源語音識別模型Whisper的過程,方便下次翻閱,如對您有所幫助不勝榮幸~

.Net Web 項目版本為:.Net 6.0

安裝Whisper.net包

首先我們在Core項目中安裝Whisper.net包。在NuGet包管理器中搜索并安裝【W(wǎng)hisper.net】和【W(wǎng)hisper.net.Runtime】包,如下圖所示:

注意,我們要找的是【W(wǎng)hisper.net】和【W(wǎng)hisper.net.Runtime】,不是、【W(wǎng)hisperNet】、【W(wǎng)hisper.Runtime】。

.Net 使用OpenAI開源語音識別模型Whisper

下載模型文件

前往Hugging Face下載Whisper的模型文件,一共有 ggml-tiny.bin、ggml-base.bin、ggml-small.bin、ggml-medium.bin、ggml-large.bin 5個模型,文件大小依次變大,識別率也依次變大。此外,【xxx.en.bin】是英文模型,【xxx.bin】支持各國語言。

我們將模型文件放到項目中即可,我這里是放到Web項目的wwwroot下:

.Net 使用OpenAI開源語音識別模型Whisper

新建Whisper幫助類

WhisperHelper.cs

.Net 使用OpenAI開源語音識別模型Whisper

using Whisper.net;
using System.IO;
using System.Collections.Generic;
using Market.Core.Enum;

namespace Market.Core.Util
{
    public class WhisperHelper
    {
        public static List<SegmentData> Segments { get; set; }
        public static WhisperProcessor Processor { get; set; }

        public WhisperHelper(ASRModelType modelType)
        {
            if(Segments == null || Processor == null)
            {
                Segments = new List<SegmentData>();

                var binName = "ggml-large.bin";
                switch (modelType)
                {
                    case ASRModelType.WhisperTiny:
                        binName = "ggml-tiny.bin";
                        break;
                    case ASRModelType.WhisperBase:
                        binName = "ggml-base.bin";
                        break;
                    case ASRModelType.WhisperSmall:
                        binName = "ggml-small.bin";
                        break;
                    case ASRModelType.WhisperMedium:
                        binName = "ggml-medium.bin";
                        break;
                    case ASRModelType.WhisperLarge:
                        binName = "ggml-large.bin";
                        break;
                    default:
                        break;
                }
                var modelFilePath = $"wwwroot/WhisperModel/{binName}";
                var factory = WhisperFactory.FromPath(modelFilePath);
                var builder = factory.CreateBuilder()
                                     .WithLanguage("zh") //中文
                                     .WithSegmentEventHandler(Segments.Add);
                var processor = builder.Build();
                Processor = processor;
            }
        }

        /// <summary>
        /// 完整的語音識別 單例實現(xiàn)
        /// </summary>
        /// <returns></returns>
        public string FullDetection(Stream speechStream)
        {
            Segments.Clear();
            var txtResult = string.Empty;

            //開始識別
            Processor.Process(speechStream);

            //識別結(jié)果處理
            foreach (var segment in Segments)
            {
                txtResult += segment.Text + "\n";
            }
            Segments.Clear();
            return txtResult;
        }
    }
}

ModelType.cs

不同的模型名字不一樣,需要用一個枚舉類作區(qū)分:

.Net 使用OpenAI開源語音識別模型Whisper

using System.ComponentModel;

namespace Market.Core.Enum
{
    /// <summary>
    /// ASR模型類型
    /// </summary>
    [Description("ASR模型類型")]
    public enum ASRModelType
    {
        /// <summary>
        /// ASRT
        /// </summary>
        [Description("ASRT")]
        ASRT = 0,

        /// <summary>
        /// WhisperTiny
        /// </summary>
        [Description("WhisperTiny")]
        WhisperTiny = 100,

        /// <summary>
        /// WhisperBase
        /// </summary>
        [Description("WhisperBase")]
        WhisperBase = 110,

        /// <summary>
        /// WhisperSmall
        /// </summary>
        [Description("WhisperSmall")]
        WhisperSmall = 120,

        /// <summary>
        /// WhisperMedium
        /// </summary>
        [Description("WhisperMedium")]
        WhisperMedium = 130,

        /// <summary>
        /// WhisperLarge
        /// </summary>
        [Description("WhisperLarge")]
        WhisperLarge = 140,

        /// <summary>
        /// PaddleSpeech
        /// </summary>
        [Description("PaddleSpeech")]
        PaddleSpeech = 200,
    }
}

后端接受音頻并識別

后端接口接受音頻二進(jìn)制字節(jié)碼,并使用Whisper幫助類進(jìn)行語音識別。

.Net 使用OpenAI開源語音識別模型Whisper

關(guān)鍵代碼如下:

public class ASRModel
{
        public string samples { get; set; }
}

/// <summary>
/// 語音識別
/// </summary>
[HttpPost]
[Route("/auth/speechRecogize")]
public async Task<IActionResult> SpeechRecogizeAsync([FromBody] ASRModel model)
{
    ResultDto result = new ResultDto();
    byte[] wavData = Convert.FromBase64String(model.samples);
    model.samples = null;   //內(nèi)存回收
    // 使用Whisper模型進(jìn)行語音識別
    var speechStream = new MemoryStream(wavData);
    var whisperManager = new WhisperHelper(model.ModelType);
    var textResult = whisperManager.FullDetection(speechStream);
    speechStream.Dispose();//內(nèi)存回收
    speechStream = null;
    wavData = null; //內(nèi)存回收
    result.Data = textResult;
    return Json(result.OK());
}

前端頁面上傳音頻

前端主要做一個音頻采集的工作,然后將音頻文件轉(zhuǎn)化成二進(jìn)制編碼傳輸?shù)胶蠖薃pi接口中

前端頁面如下:

.Net 使用OpenAI開源語音識別模型Whisper

頁面代碼如下:

@{
    Layout = null;
}
@using Karambolo.AspNetCore.Bundling.ViewHelpers
@addTagHelper *, Karambolo.AspNetCore.Bundling
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <title>語音錄制</title>
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <environment names="Development">
        <link href="~/content/plugins/element-ui/index.css" rel="stylesheet" />
        <script src="~/content/plugins/jquery/jquery-3.4.1.min.js"></script>
        <script src="~/content/js/matomo.js"></script>
        <script src="~/content/js/slick.min.js"></script>
        <script src="~/content/js/masonry.js"></script>
        <script src="~/content/js/instafeed.min.js"></script>
        <script src="~/content/js/headroom.js"></script>
        <script src="~/content/js/readingTime.min.js"></script>
        <script src="~/content/js/script.js"></script>
        <script src="~/content/js/prism.js"></script>
        <script src="~/content/js/recorder-core.js"></script>
        <script src="~/content/js/wav.js"></script>
        <script src="~/content/js/waveview.js"></script>
        <script src="~/content/js/vue.js"></script>
        <script src="~/content/plugins/element-ui/index.js"></script>
        <script src="~/content/js/request.js"></script>
    </environment>
    <environment names="Stage,Production">
        @await Styles.RenderAsync("~/bundles/login.css")
        @await Scripts.RenderAsync("~/bundles/login.js")
    </environment>
    <style>
        html,
        body {
            margin: 0;
            height: 100%;
        }

        body {
            padding: 20px;
            box-sizing: border-box;
        }
        audio {
            display:block;
        }
        audio + audio {
            margin-top: 20px;
        }
        .el-textarea .el-textarea__inner {
            color: #000 !important;
            font-size: 18px;
            font-weight: 600;
        }
        #app {
            height: 100%;
        }
        .content {
            height: calc(100% - 130px);
            overflow: auto;
        }
        .content > div {
            margin: 10px 0 20px;
        }
        .press {
            height: 40px;
            line-height: 40px;
            border-radius: 5px;
            border: 1px solid #dcdfe6;
            cursor: pointer;
            width: 100%;
            text-align: center;
            background: #fff;
        }
    </style>
</head>

<body>
    <div id="app">
        <div style="display: flex; justify-content: space-between; align-items: center;">
            <center>{{isPC? '我是電腦版' : '我是手機(jī)版'}}</center>
            <center style="margin: 10px 0">
                <el-radio-group v-model="modelType">
                    <el-radio :label="0">ASRT</el-radio>
                    <el-radio :label="100">WhisperTiny</el-radio>
                    <el-radio :label="110">WhisperBase</el-radio>
                    <el-radio :label="120">WhisperSmall</el-radio>
                    <el-radio :label="130">WhisperMedium</el-radio>
                    <el-radio :label="140">WhisperLarge</el-radio>
                    <el-radio :label="200">PaddleSpeech</el-radio>
                </el-radio-group>
            </center>
            <el-button type="primary" size="small" onclick="window.location.href = '/'">返回</el-button>
        </div>
        <div class="content" id="wav_pannel">
            @*{{textarea}}*@
        </div>
        <div style="margin-top: 20px"></div>
        <center style="height: 40px;"><h4 id="msgbox" v-if="messageSatuts">{{message}}</h4></center>
        <button class="press" v-on:touchstart="start" v-on:touchend="end" v-if="!isPC">
            按住 說話
        </button>
        <button class="press" v-on:mousedown="start" v-on:mouseup="end" v-else>
            按住 說話
        </button>
    </div>
</body>

</html>
<script>
    var blob_wav_current;
    var rec;
    var recOpen = function (success) {
        rec = Recorder({
            type: "wav",
            sampleRate: 16000,
            bitRate: 16,
            onProcess: (buffers, powerLevel, bufferDuration, bufferSampleRate, newBufferIdx, asyncEnd) => {

            }
        });
        rec.open(() => {
            success && success();
        }, (msg, isUserNotAllow) => {
            app.textarea = (isUserNotAllow ? "UserNotAllow," : "") + "無法錄音:" + msg;
        });
    };
    var app = new Vue({
        el: '#app',
        data: {
            textarea: '',
            message: '',
            messageSatuts: false,
            modelType: 0,
        },
        computed: {
            isPC() {
                var userAgentInfo = navigator.userAgent;
                var Agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPod", "iPad"];
                var flag = true;
                for (var i = 0; i < Agents.length; i++) {
                    if (userAgentInfo.indexOf(Agents[i]) > 0) {
                        flag = false;
                        break;
                    }
                }
                return flag;
            }
        },
        methods: {
            start() {
                app.message = "正在錄音...";
                app.messageSatuts = true;
                recOpen(function() {
                    app.recStart();
                });
            },
            end() {
                if (rec) {
                    rec.stop(function (blob, duration) {
                        app.messageSatuts = false;
                        rec.close();
                        rec = null;
                        blob_wav_current = blob;
                        var audio = document.createElement("audio");
                        audio.controls = true;
                        var dom = document.getElementById("wav_pannel");
                        dom.appendChild(audio);
                        audio.src = (window.URL || webkitURL).createObjectURL(blob);
                        //audio.play();
                        app.messageSatuts = false;
                        app.upload();
                    }, function (msg) {
                        console.log("錄音失敗:" + msg);
                        rec.close();
                        rec = null;
                    });
                    app.message = "錄音停止";
                }
            },
            upload() {
                app.message = "正在上傳識別...";
                app.messageSatuts = true;
                var blob = blob_wav_current;
                var reader = new FileReader();
                reader.onloadend = function(){
                    var data = {
                        samples: (/.+;\s*base64\s*,\s*(.+)$/i.exec(reader.result) || [])[1],
                        sample_rate: 16000,
                        channels: 1,
                        byte_width: 2,
                        modelType: app.modelType
                    }
                    $.post('/auth/speechRecogize', data, function(res) {
                        if (res.data && res.data.statusCode == 200000) {
                            app.messageSatuts = false;
                            app.textarea = res.data.text == '' ? '暫未識別出來,請重新試試' : res.data.text;
                        } else {
                            app.textarea = "識別失敗";
                        }
                        var dom = document.getElementById("wav_pannel");
                        var div = document.createElement("div");
                        div.innerHTML = app.textarea;
                        dom.appendChild(div);
                        $('#wav_pannel').animate({ scrollTop: $('#wav_pannel')[0].scrollHeight - $('#wav_pannel')[0].offsetHeight });
                    })
                };
                reader.readAsDataURL(blob);
            },
            recStart() {
                rec.start();
            },
        }
    })
</script>

引用

whisper官網(wǎng)

測試離線音頻轉(zhuǎn)文本模型Whisper.net的基本用法

whisper.cpp的github

whisper.net的github

whisper模型下載文章來源地址http://www.zghlxwxcb.cn/news/detail-482489.html

到了這里,關(guān)于.Net 使用OpenAI開源語音識別模型Whisper的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 使用OpenAI的Whisper 模型進(jìn)行語音識別

    使用OpenAI的Whisper 模型進(jìn)行語音識別

    原文:https://baijiahao.baidu.com/s?id=1756232395896695428wfr=spiderfor=pc 語音識別是人工智能中的一個領(lǐng)域,它允許計算機(jī)理解人類語音并將其轉(zhuǎn)換為文本。 該技術(shù)用于 Alexa 和各種聊天機(jī)器人應(yīng)用程序等設(shè)備。 而我們最常見的就是語音轉(zhuǎn)錄,語音轉(zhuǎn)錄可以語音轉(zhuǎn)換為文字記錄或字幕。

    2024年02月03日
    瀏覽(88)
  • OpenAI的人工智能語音識別模型Whisper詳解及使用

    OpenAI的人工智能語音識別模型Whisper詳解及使用

    ????????擁有ChatGPT語言模型的OpenAI公司,開源了 Whisper 自動語音識別系統(tǒng),OpenAI 強(qiáng)調(diào) Whisper 的語音識別能力已達(dá)到人類水準(zhǔn)。 ????????Whisper是一個通用的語音識別模型,它使用了大量的多語言和多任務(wù)的監(jiān)督數(shù)據(jù)來訓(xùn)練,能夠在英語語音識別上達(dá)到接近人類水平的魯

    2024年02月09日
    瀏覽(94)
  • OpenAI 開源語音識別 Whisper

    OpenAI 開源語音識別 Whisper

    ????????Whisper是一個通用語音識別模型。它是在各種音頻的大型數(shù)據(jù)集上訓(xùn)練的,也是一個多任務(wù)模型,可以執(zhí)行多語言語音識別以及語音翻譯和語言識別。???????? ???????人工智能公司 OpenAI?擁有 GTP-3 語言模型,并為 GitHub Copilot 提供技術(shù)支持的 ,宣布開源了

    2024年02月09日
    瀏覽(111)
  • 語音識別開源框架 openAI-whisper

    Whisper 是一種通用的語音識別模型。 它是OpenAI于2022年9月份開源的在各種音頻的大型數(shù)據(jù)集上訓(xùn)練的語音識別模型,也是一個可以執(zhí)行多語言語音識別、語音翻譯和語言識別的多任務(wù)模型。 GitHub - yeyupiaoling/Whisper-Finetune: 微調(diào)Whisper語音識別模型和加速推理,支持Web部署和Andr

    2024年02月17日
    瀏覽(96)
  • OpenAI開源??!Whisper語音識別實戰(zhàn)??!【環(huán)境配置+代碼實現(xiàn)】

    OpenAI開源!!Whisper語音識別實戰(zhàn)??!【環(huán)境配置+代碼實現(xiàn)】

    目錄 環(huán)境配置 代碼實現(xiàn) ******? 實現(xiàn) .mp4轉(zhuǎn)換為 .wav文件,識別后進(jìn)行匹配并輸出出現(xiàn)的次數(shù) ******? 完整代碼實現(xiàn)請私信 安裝 ffmpeg 打開網(wǎng)址? ?https://github.com/BtbN/FFmpeg-Builds/releases 下載如下圖所示的文件 下載后解壓 ?我的路徑是G:ffmpeg-master-latest-win64-gpl-shared

    2024年02月13日
    瀏覽(24)
  • 可以白嫖的語音識別開源項目whisper的搭建詳細(xì)過程 | 如何在Linux中搭建OpenAI開源的語音識別項目Whisper

    可以白嫖的語音識別開源項目whisper的搭建詳細(xì)過程 | 如何在Linux中搭建OpenAI開源的語音識別項目Whisper

    原文來自我個人的博客。 服務(wù)器為GPU服務(wù)器。點擊這里跳轉(zhuǎn)到我使用的GPU服務(wù)器。我搭建 whisper 選用的是 NVIDIA A 100顯卡,4GB顯存。 Python版本要在3.8~3.11之間。 輸入下面命令查看使用的Python版本。 為啥要安裝Anaconda? 為了減少不同項目使用的庫的版本沖突,我們可以使用An

    2024年02月09日
    瀏覽(19)
  • OpenAI-whisper語音識別模型

    OpenAI-whisper語音識別模型

    Whisper是一個通用的語音識別模型。它是在不同音頻的大型數(shù)據(jù)集上訓(xùn)練的,也是一個多任務(wù)模型,可以執(zhí)行多語言語音識別、語音翻譯和語言識別。 whisper有五種模型尺寸,提供速度和準(zhǔn)確性的平衡,其中English-only模型提供了四種選擇。下面是可用模型的名稱、大致內(nèi)存需求

    2024年02月09日
    瀏覽(100)
  • chatGPT的耳朵!OpenAI的開源語音識別AI:Whisper !

    chatGPT的耳朵!OpenAI的開源語音識別AI:Whisper !

    語音識別是通用人工智能的重要一環(huán)!可以說是AI的耳朵! 它可以讓機(jī)器理解人類的語音,并將其轉(zhuǎn)換為文本或其他形式的輸出。 語音識別的應(yīng)用場景非常廣泛,比如智能助理、語音搜索、語音翻譯、語音輸入等等。 然而,語音識別也面臨著很多挑戰(zhàn),比如不同的語言、口

    2024年03月14日
    瀏覽(26)
  • 基于OpenAI的Whisper構(gòu)建的高效語音識別模型:faster-whisper

    基于OpenAI的Whisper構(gòu)建的高效語音識別模型:faster-whisper

    faster-whisper是基于OpenAI的Whisper模型的高效實現(xiàn),它利用CTranslate2,一個專為Transformer模型設(shè)計的快速推理引擎。這種實現(xiàn)不僅提高了語音識別的速度,還優(yōu)化了內(nèi)存使用效率。faster-whisper的核心優(yōu)勢在于其能夠在保持原有模型準(zhǔn)確度的同時,大幅提升處理速度,這使得它在處理

    2024年02月02日
    瀏覽(94)
  • openai開源的whisper在huggingface中使用例子(語音轉(zhuǎn)文字中文)

    openai開源的whisper在huggingface中使用例子(語音轉(zhuǎn)文字中文)

    openai開源的語音轉(zhuǎn)文字支持多語言在huggingface中使用例子。 目前發(fā)現(xiàn)多語言模型large-v2支持中文是繁體,因此需要繁體轉(zhuǎn)簡體。 后續(xù)編寫微調(diào)訓(xùn)練例子 GitHub地址: https://github.com/openai/whisper

    2024年02月11日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包