引言
現(xiàn)階段,語音自動識別功能已趨于完善,對與大部分用戶來說,能說能聽足矣!在說聽的同時還能看,豈不美哉?對此,Google提供了語音轉為文字的應用——Cloud Speech API。本文將從使用該API的前提條件,注意事項,在.net開發(fā)環(huán)境下實現(xiàn)從本地讀取音頻文件解析為文字,從Google Cloud Storage中讀取音頻文件解析文字,以及上傳本地音頻文件到Google Cloud Storage。
調用API前提條件
一.既然是用Google的API,在內地你首先保證能(fq)訪問Google官網(wǎng),具體操作此處就省略操作關于翻墻軟件,代理服務的文字。
二.注冊Google帳號,登錄Google Cloud Platform,創(chuàng)建項目,在API管理器中添加項目憑據(jù)。憑據(jù)1為服務賬號密匙,OAuth客戶端ID。其具體操作見文檔–Google Cloud Speech API調用注意事項,里面有詳細操作步驟及步驟截圖。因該API為付費產(chǎn)品,需在創(chuàng)建項目后對其付費,Google推出免費60天使用及300刀的贈金,對與初次研究者來說就是注冊Google云平臺的事罷了。
三.滿足上面兩條件,基本可以保證對一定規(guī)則的音頻文件調用Cloud Speech API后轉換成文字。對與音頻文件的要求如下:
1.音頻的編碼格式:1聲道,PCM;
2.采樣頻率:16000HZ;
3.讀取本地的音頻文件播放時長小于60s,讀取云存儲中的音頻文件播放時長小于80min。
以上條件是最基本的,對于其它詳細內容請訪問該地址。
四.在VS2015中使用該接口,首先需要安裝并引用如下DLL到項目中:
獲取以上DLL方式:
1.通過在項目引用中點擊Nuget程序包中搜尋Dll名字進行下載安裝,
2.通過Nuget的程序包管理器控制平臺輸入命令進行安裝。
命令有Install-Package Google.Apis;Install-Package Google.Apis.Core;Install-Package Google.Apis.CloudSpeechAPI.v1beta1等。
如果安裝或下載均不方便,可以從這里獲取一系列DLL。完成以上步驟后,接下來就用代碼展示該API的魅力吧。
讀取本地音頻文件轉換為文字
注:如下Demo是windows應用程序,所有方法都為static
1.創(chuàng)建類型為CloudSpeechAPIService的方法,目的是通過環(huán)境變量獲取Google的憑證,連接在云平臺建立的項目。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
});//獲取認證
}
return new CloudSpeechAPIService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "DotNet Google Cloud Platform Speech Sample",
});
}
2.讀取本地音頻文件,調用Cloud Speech API進行文字轉換。ps:音頻文件格式最好為1聲道PCM,播放長度小于60s,否則不易獲取正確轉換結果。
static public void Main(string[] args)
{
var service = CreateAuthorizedClient();//獲取云服務認證
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"//英文播放內容
//LanguageCode = "cmn-Hans-CN"中文播放內容
},
Audio = new Google.Apis.CloudSpeechAPI.v1beta1.Data.RecognitionAudio()
{
Content = Convert.ToBase64String(File.ReadAllBytes(audio_file_path))//讀取文件轉換為Base64字符串
}
};
// 配置完成
// 調用GloudSpeechAPI進行請求
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);//將轉換結果放入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();
// 結束請求
}
通過如上方法,就可以獲取到音頻文件播放內容。