引言
現(xiàn)階段,語音自動識別功能已趨于完善,對與大部分用戶來說,能說能聽足矣!在說聽的同時還能看,豈不美哉?對此,Google提供了語音轉(zhuǎn)為文字的應(yīng)用——Cloud Speech API。本文將從使用該API的前提條件,注意事項(xiàng),在.net開發(fā)環(huán)境下實(shí)現(xiàn)從本地讀取音頻文件解析為文字,從Google Cloud Storage中讀取音頻文件解析文字,以及上傳本地音頻文件到Google Cloud Storage。
調(diào)用API前提條件
一.既然是用Google的API,在內(nèi)地你首先保證能(fq)訪問Google官網(wǎng),具體操作此處就省略操作關(guān)于翻墻軟件,代理服務(wù)的文字。
二.注冊Google帳號,登錄Google Cloud Platform,創(chuàng)建項(xiàng)目,在API管理器中添加項(xiàng)目憑據(jù)。憑據(jù)1為服務(wù)賬號密匙,OAuth客戶端ID。其具體操作見文檔–Google Cloud Speech API調(diào)用注意事項(xiàng),里面有詳細(xì)操作步驟及步驟截圖。因該API為付費(fèi)產(chǎn)品,需在創(chuàng)建項(xiàng)目后對其付費(fèi),Google推出免費(fèi)60天使用及300刀的贈金,對與初次研究者來說就是注冊Google云平臺的事罷了。
三.滿足上面兩條件,基本可以保證對一定規(guī)則的音頻文件調(diào)用Cloud Speech API后轉(zhuǎn)換成文字。對與音頻文件的要求如下:
1.音頻的編碼格式:1聲道,PCM;
2.采樣頻率:16000HZ;
3.讀取本地的音頻文件播放時長小于60s,讀取云存儲中的音頻文件播放時長小于80min。
以上條件是最基本的,對于其它詳細(xì)內(nèi)容請?jiān)L問該地址。
四.在VS2015中使用該接口,首先需要安裝并引用如下DLL到項(xiàng)目中:
獲取以上DLL方式:
1.通過在項(xiàng)目引用中點(diǎn)擊Nuget程序包中搜尋Dll名字進(jìn)行下載安裝,
2.通過Nuget的程序包管理器控制平臺輸入命令進(jìn)行安裝。
命令有Install-Package Google.Apis;Install-Package Google.Apis.Core;Install-Package Google.Apis.CloudSpeechAPI.v1beta1等。
如果安裝或下載均不方便,可以從這里獲取一系列DLL。完成以上步驟后,接下來就用代碼展示該API的魅力吧。
讀取本地音頻文件轉(zhuǎn)換為文字
注:如下Demo是windows應(yīng)用程序,所有方法都為static
1.創(chuàng)建類型為CloudSpeechAPIService的方法,目的是通過環(huán)境變量獲取Google的憑證,連接在云平臺建立的項(xiàng)目。PS:如果此方法出現(xiàn)異常,請查看前提條件二。
static public CloudSpeechAPIService CreateAuthorizedClient()
{
GoogleCredential credential =GoogleCredential.GetApplicationDefaultAsync().Result;//讀取環(huán)境變量中的GOOGLE_APPLICATION_CREDENTIALS
if (credential.IsCreateScopedRequired)
{
credential = credential.CreateScoped(new[]
{
CloudSpeechAPIService.Scope.CloudPlatform
});//獲取認(rèn)證
}
return new CloudSpeechAPIService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "DotNet Google Cloud Platform Speech Sample",
});
}
2.讀取本地音頻文件,調(diào)用Cloud Speech API進(jìn)行文字轉(zhuǎn)換。ps:音頻文件格式最好為1聲道PCM,播放長度小于60s,否則不易獲取正確轉(zhuǎn)換結(jié)果。
static public void Main(string[] args)
{
var service = CreateAuthorizedClient();//獲取云服務(wù)認(rèn)證
string audio_file_path = "本地文件路徑";
//配置參數(shù)
var request = new Google.Apis.CloudSpeechAPI.v1beta1.Data.SyncRecognizeRequest()
{
Config = new Google.Apis.CloudSpeechAPI.v1beta1.Data.RecognitionConfig()
{
Encoding = "LINEAR16",//編碼格式
SampleRate = 16000,//采樣頻率
LanguageCode = "en-US"//英文播放內(nèi)容
//LanguageCode = "cmn-Hans-CN"中文播放內(nèi)容
},
Audio = new Google.Apis.CloudSpeechAPI.v1beta1.Data.RecognitionAudio()
{
Content = Convert.ToBase64String(File.ReadAllBytes(audio_file_path))//讀取文件轉(zhuǎn)換為Base64字符串
}
};
// 配置完成
// 調(diào)用GloudSpeechAPI進(jìn)行請求
StringBuilder sb = new StringBuilder();
Console.WriteLine("Starte Time :" + startTime);
try
{
var asyncResponse = service.Speech.Asyncrecognize(request).Execute();
var name = asyncResponse.Name;
Google.Apis.CloudSpeechAPI.v1beta1.Data.Operation op;
do
{
Console.WriteLine("Waiting for server processing...");
Thread.Sleep(1000);
op = service.Operations.Get(name).Execute();
if (op.Error?.Message != null)
{
Console.WriteLine(op.Error.Message);
}
} while (!(op.Done.HasValue && op.Done.Value));
dynamic results = op.Response["results"];
foreach (var result in results)
{
foreach (var alternative in result.alternatives)
{
sb.Append(alternative.transcript);//將轉(zhuǎn)換結(jié)果放入StringBuilder中
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
DateTime endTime = DateTime.Now;
var timeTaken = endTime - startTime;
sb.Append("\r\nEnd Time:" + endTime + "\t" + "Time-taken:" + (timeTaken));
Console.WriteLine( sb.ToString());
Console.ReadKey();
// 結(jié)束請求
}
通過如上方法,就可以獲取到音頻文件播放內(nèi)容。