最近在看小眾西語電影,但苦于沒字幕,只能自己想辦法弄實(shí)時(shí)語音識(shí)別。然而網(wǎng)上給出的很多相關(guān)代碼,大部分是基于已有的wav文件或者麥克風(fēng)外錄的方式實(shí)現(xiàn)的。我這里就稍微改進(jìn)了一下,可以在內(nèi)錄(英文資料說的的是loopback audio recording)的情況下進(jìn)行語音轉(zhuǎn)文字。這里最簡單的思路是采用Vosk這個(gè)比較成熟的離線語音識(shí)別API,然后在.NET平臺(tái)上,用NAudio庫自帶的WasapiLoopbackCapture進(jìn)行內(nèi)錄,并在DataAvaliable事件處理代碼塊中,對(duì)采集到的音頻數(shù)據(jù)字節(jié)流進(jìn)行部分識(shí)別,最后輸出完整識(shí)別出來的內(nèi)容。
Vosk和NAudio這兩個(gè)3rd模塊需要通過nuget包管理器安裝,然后語音識(shí)別用到的模型文件可以在VOSK Models上下載。一般情況下,每個(gè)語種至少有兩個(gè)模型文件,其中一個(gè)帶"small"的模型是精簡版模型,用在低性能電腦、手機(jī)和嵌入式設(shè)備上跑比較好,不過識(shí)別準(zhǔn)確率不太高:( ;還有一個(gè)普通的模型,大小在1GB以上的,這個(gè)識(shí)別準(zhǔn)確率非常高,但是放在手機(jī)上跑不太合適。
?大家根據(jù)自己的需求下載對(duì)應(yīng)語種、對(duì)應(yīng)規(guī)模的語言模型包,然后解壓到程序執(zhí)行目錄。
下面廢話不多說,直接上代碼:
using NAudio.Wave;
using System.Text;
using Vosk;
class SpeechToText
{
static void Main()
{
Console.OutputEncoding = Encoding.UTF8;
// Initialize Vosk API
Model model = new Model("model-small-es");
using (var waveIn = new WasapiLoopbackCapture())
{
waveIn.WaveFormat = new WaveFormat(44100, 1);
var rec = new VoskRecognizer(model, waveIn.WaveFormat.SampleRate);
rec.SetMaxAlternatives(0);
rec.SetWords(true);
waveIn.DataAvailable += (_, e) =>
{
if (rec.AcceptWaveform(e.Buffer, e.BytesRecorded))
{
Console.WriteLine(rec.Result());
}
else
{
Console.WriteLine(rec.PartialResult());
}
};
waveIn.StartRecording();
Console.WriteLine("Press ENTER to quit...");
Console.ReadLine();
waveIn.StopRecording();
}
}
}
代碼邏輯很簡單這里就不再贅述,不過有幾點(diǎn)需要注意一下:
1. WaveFormat的參數(shù)設(shè)置問題:一定不能用雙聲道!Vosk似乎不怎么支持雙聲道數(shù)據(jù)的處理,我用這個(gè)參數(shù)的時(shí)候程序總是跑到一半就崩了。然后采樣率,很多人給出的代碼都配置的是16kHz,我覺得質(zhì)量太低識(shí)別效果不好,嘗試了一下改到44.1kHz,程序仍然能跑,而且識(shí)別準(zhǔn)確率高了很多,但是再往上我就沒試了,而且沒必要。
2. MaxAlternatives這個(gè)參數(shù)是告訴vosk識(shí)別完成后給出多少種備選結(jié)果,我們只需要一種結(jié)果就行了,也就是不需要備選結(jié)果,這里設(shè)置為0即可。
3. SetWords這個(gè)函數(shù)是告訴vosk識(shí)別完成后是否需要顯示每個(gè)單詞出現(xiàn)和結(jié)束的時(shí)間(從錄音起始開始算起),這個(gè)對(duì)做滾動(dòng)歌詞和字幕的伙計(jì)們就非常有用了,如果大家覺得煩人可以把它設(shè)成false。
4. 如果你用的語言模型包和我的不一樣,一定不要忘記修改上面代碼中的模型路徑?。?!
我給出的是一個(gè)簡單的控制臺(tái)程序代碼,主要在于簡便,方便給大家復(fù)制并用到自己的項(xiàng)目中。程序啟動(dòng)后會(huì)一直運(yùn)行,直到用戶按下回車鍵才會(huì)退出。
效果:
文章來源:http://www.zghlxwxcb.cn/news/detail-622233.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-622233.html
到了這里,關(guān)于Vosk 揚(yáng)聲器內(nèi)錄語音識(shí)別轉(zhuǎn)文字 最簡潔的C#代碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!