使用訊飛開放平臺實現語音識別合成
發 社會和產品的發展總是向著便利和智能的方法發展,對于手機的App來說也是如此.所以,現在的App都在縮減流程,優化使用體驗,為的就是讓用戶用起來更加便利,提高App的入手度和用戶粘性.那么另一方面的智能呢?
一個比較簡單智能的實現方法就是在輸入的地方加上語音識別,在輸出顯示的時候加上語音合成,直接進行語音播報,那么是不是對于司機等來說就是一個智能的體現呢?
現在做語音識別有一些不錯的開放平臺可以給我們直接提供使用,一家是科大訊飛開放平臺,一家是百度語音開放平臺.我個人比較喜歡訊飛,因為訊飛的優 勢是在大段文字的識別上,準確率比較高.這正好符合我的需求,這篇博客也主要講的是訊飛語音SDK的使用.
訊飛開發步驟
訊飛開發教程上寫的比較清楚也比較啰嗦,并不是一個最簡潔的Demo.所以我在這篇博客里進行了一些適當的刪減,爭取做一個最簡單的demo.
1 申請賬號ID
登陸到訊飛開放平臺上,在用戶菜單欄里就有創建我的應用.這里的登陸也可以采用第三方的方式.在創建應用的界面填寫相關的信息即可.然后就會有一個SDK下載的鏈接.如果沒有,直接去SDK下載中心按照三步選項去進行新的下載即可.這里不做過多的描述.
2 導入訊飛SDK框架
下載下來的SDK包解壓出來有三個文件夾,第一個市doc文件夾,不多說,肯定是開發文檔,還有 相關的作者信息什么的.最重要的是剩下的兩個文件夾,一個是lib文件夾,這里存放的是訊飛SDK的類庫文件,我們導入SDK就是導入的這里的文件.第三 個文件夾是一個IOS的Demo演示工程.
1 添加靜態庫
新建一個IOS工程,將lib文件夾下的”iflyMSC.framework”文件拷貝到工程目錄下,然后在工程配置文件的[Build Phases]-[Link Binary With Libraries]中通過[AddOther]
2 確認SDK路徑
在配置文件中搜索”head”找到[Framework Search Paths],點開查看SDK的路徑是不是絕對路徑,如果是如下圖的樣子,那就沒問題了.這一步主要是確保SDK的路徑為相對路徑,防止工程換了文件夾位置就無法運行的情況的發生.
3 添加框架
按照下圖依次將圖中的所有的框架添加到工程里面.訊飛官網API中給出的截圖是XCode7以前的,XCode7之后一些動態鏈接庫的后綴名發生了改變,Xcode7中添加完畢之后如下圖:
?
語音識別
語音識別分兩種,分別用在不同的場合,一個是界面提示的語音識別,一個是無界面提示的語音識別,這里以有界面提示的語音識別為例子.
有界面提示的語音識別
1 導入頭文件
//將訊飛SDK中的所有類都導入進來
#import < iflyMSC/iflyMSC.h >
2 登陸訊飛服務器
在使用訊飛的語音解析之前,需要進行用戶身份驗證,即登陸訊飛服務器,這個在viewDidLoad()方法中添加兩行代碼即可.后面的ID數字就是之前我們在開放平臺創建按自己應用時給的APPID,在下載的SDK中也是有的.
NSString *initString = [[NSString alloc] initWithFormat:
@"appid=%@",
@"565e4dd9"];
[IFlySpeechUtility createUtility:initString]; ?
3 創建有界面提示的語音識別對象
創建一個訊飛語音識別對象,可以對他進行一系列的調用
@property (nonatomic, strong) IFlyRecognizerView *iflyRecognizerView;
//帶界面的識別對象 ?
4 初始化帶界面的識別對象
前面聲明了一個帶界面的語音識別對象,現在需要對這個識別對象進行初始化,同樣是在ViewDidLoad()方法中進行就行.
#pragma mark ------ 進行有界面的語音識別的初始化
_iflyRecognizerView =
[[IFlyRecognizerView alloc] initWithCenter:self.view.center];
_iflyRecognizerView.delegate =
self;
[_iflyRecognizerView setParameter: @"iat" forKey: [IFlySpeechConstant IFLY_DOMAIN]];
//asr_audio_path保存錄音文件名,如不再需要,設置value為nil表示取消,默認目錄是documents
[_iflyRecognizerView setParameter:
@"asrview.pcm " forKey:[IFlySpeechConstant ASR_AUDIO_PATH]];
?
5 實現代理方法
訊飛對識別結果的處理采用的代理回調的方法,實現IFlySpeechSynthesizerDelegate協議的onResult:isLast:方法.
注意!!!!這里的是onResult,不是onResults,后者是無界面提示的語音解析的結果回調函數.
- (
void)onResult: (NSArray *
)resultArray isLast:(BOOL) isLast
{NSMutableString *result =
[[NSMutableString alloc] init];NSDictionary *dic = [resultArray objectAtIndex:
0];for (NSString *key
in dic) {[result appendFormat:@"%@",key];}
//這里需要在下載的demo里面拖入ISRDataHelper.h和ISRDataHelper.m文件然背后引入頭文件NSString * resu =
[ISRDataHelper stringFromJson:result];//將結果顯示在界面的Label上_text.text = [NSString stringWithFormat:
@"%@%@",_text.text,resu];
} 這里默認的傳回來的是Json字符串,需要對字符串進行解析.當然,訊飛還是比較良心的,在demo中給提供了一個解析類,就是上面用到的ISRDataHelper.用它來進行解析就可以了. 6 觸發開始語音識別 拖動一個Button,給一個響應事件,用于開始監聽語音識別
//啟動識別服務
[_iflyRecognizerView start];
?
這個時候運行App,就可以進行語音識別了,運行的結果應該如下圖:
無界面提示的語音識別
無界面提示的語音識別適合將語音識別放在后臺,這個看具體的使用場景.無界面的方式相對來說簡潔大方,可制定性高.
1 導入頭文件
//將訊飛SDK中的所有類都導入進來
#import < iflyMSC/iflyMSC.h >
?
2 登陸訊飛服務器
在使用訊飛的語音解析之前,需要進行用戶身份驗證,即登陸訊飛服務器,這個在viewDidLoad()方法中添加兩行代碼即可.后面的ID數字就是之前我們在開放平臺創建按自己應用時給的APPID,在下載的SDK中也是有的.
NSString *initString = [[NSString alloc] initWithFormat:
@"appid=%@",
@"565e4dd9"];
[IFlySpeechUtility createUtility:initString]; ?
3 創建無界面提示的語音識別對象
創建一個訊飛語音識別對象,可以對他進行一系列的調用
@property (nonatomic, strong) IFlySpeechRecognizer *iFlySpeechRecognizer;
//不帶界面的識別對象 ?
4 對象初始化
前面聲明了一些在語音合成的時候會用到的對象,現在需要對前面的對象進行初始化.還是在ViewDidLoad()里面進行就可以了.這里的初始化內容比較多,是進行一些語音的設置,所以單獨做成了一個方法,在ViewDidLoad()中進行調用即可.
-(
void)initRecognizer{
//單例模式,無UI的實例
if (_iFlySpeechRecognizer ==
nil) {_iFlySpeechRecognizer = [IFlySpeechRecognizer sharedInstance]; [_iFlySpeechRecognizer setParameter:
@"" forKey:[IFlySpeechConstant PARAMS]];//設置聽寫模式[_iFlySpeechRecognizer setParameter:
@"iat" forKey:[IFlySpeechConstant IFLY_DOMAIN]];
}
_iFlySpeechRecognizer.delegate =
self;
if (_iFlySpeechRecognizer !=
nil) {IATConfig *instance =
[IATConfig sharedInstance]; //設置最長錄音時間
[_iFlySpeechRecognizer setParameter:instance.speechTimeout forKey:[IFlySpeechConstant SPEECH_TIMEOUT]];//設置后端點
[_iFlySpeechRecognizer setParameter:instance.vadEos forKey:[IFlySpeechConstant VAD_EOS]];//設置前端點
[_iFlySpeechRecognizer setParameter:instance.vadBos forKey:[IFlySpeechConstant VAD_BOS]];//網絡等待時間[_iFlySpeechRecognizer setParameter:
@"20000" forKey:[IFlySpeechConstant NET_TIMEOUT]]; //設置采樣率,推薦使用16K
[_iFlySpeechRecognizer setParameter:instance.sampleRate forKey:[IFlySpeechConstant SAMPLE_RATE]]; if ([instance.language isEqualToString:[IATConfig chinese]]) {//設置語言
[_iFlySpeechRecognizer setParameter:instance.language forKey:[IFlySpeechConstant LANGUAGE]];//設置方言
[_iFlySpeechRecognizer setParameter:instance.accent forKey:[IFlySpeechConstant ACCENT]];}else if ([instance.language isEqualToString:[IATConfig english]]) {[_iFlySpeechRecognizer setParameter:instance.language forKey:[IFlySpeechConstant LANGUAGE]];}//設置是否返回標點符號
[_iFlySpeechRecognizer setParameter:instance.dot forKey:[IFlySpeechConstant ASR_PTT]];
}
} ?
5 實現代理方法
訊飛對識別結果的處理采用的代理回調的方法,實現IFlySpeechSynthesizerDelegate協議的onResult:isLast:方法.
注意!!!!這里的是onResults,不是onResult,前者是有界面提示的語音識別的結果回調函數.
- (
void) onResults:(NSArray *
) results isLast:(BOOL)isLast{NSMutableString *result =
[[NSMutableString alloc] init];NSDictionary *dic = [results objectAtIndex:
0];for (NSString *key
in dic) {[result appendFormat:@"%@",key];}NSString * resu =
[ISRDataHelper stringFromJson:result];_text.text = [NSString stringWithFormat:
@"%@%@",_text.text,resu];
} ?
6 觸發語音合成
添加一個輸入框,一個button,button的響應時間是將輸入框中的文本內容讀出來.
if(_iFlySpeechRecognizer ==
nil)
{[self initRecognizer];
}
[_iFlySpeechRecognizer cancel];
//設置音頻來源為麥克風
[_iFlySpeechRecognizer setParameter:IFLY_AUDIO_SOURCE_MIC forKey:
@"audio_source"];
//設置聽寫結果格式為json
[_iFlySpeechRecognizer setParameter:
@"json" forKey:[IFlySpeechConstant RESULT_TYPE]];
//保存錄音文件,保存在sdk工作路徑中,如未設置工作路徑,則默認保存在library/cache下
[_iFlySpeechRecognizer setParameter:
@"asr.pcm" forKey:[IFlySpeechConstant ASR_AUDIO_PATH]];
[_iFlySpeechRecognizer setDelegate:self];
BOOL ret = [_iFlySpeechRecognizer startListening];
?
語音合成
語音合成和語音識別的過程差不多
1 導入頭文件
//將訊飛SDK中的所有類都導入進來
#import < iflyMSC/iflyMSC.h >
#import "PcmPlayer.h"
#import "TTSConfig.h" ?
2 登陸訊飛服務器
在使用訊飛的語音解析之前,需要進行用戶身份驗證,即登陸訊飛服務器,這個在viewDidLoad()方法中添加兩行代碼即可.后面的ID數字就是之前我們在開放平臺創建按自己應用時給的APPID,在下載的SDK中也是有的.
NSString *initString = [[NSString alloc] initWithFormat:
@"appid=%@",
@"565e4dd9"];
[IFlySpeechUtility createUtility:initString]; ?
3 創建有界面提示的語音識別對象
創建一個訊飛語音識別對象,可以對他進行一系列的調用
typedef NS_OPTIONS(NSInteger, SynthesizeType) {NomalType =
5,
//普通合成UriType =
6,
//uri合成
};
@property (nonatomic, strong) IFlySpeechSynthesizer * iFlySpeechSynthesizer;
//語音合成對象
@property (nonatomic, strong) PcmPlayer *audioPlayer;
//用于播放音頻的
@property (nonatomic, assign) SynthesizeType synType;
//是何種合成方式
@property (nonatomic, assign) BOOL hasError;
//解析過程中是否出現錯誤 ?
4 對象初始化
前面聲明了一些在語音合成的時候會用到的對象,現在需要對前面的對象進行初始化.還是在ViewDidLoad()里面進行就可以了.
TTSConfig *instance =
[TTSConfig sharedInstance];
if (instance ==
nil) {return;
}
//合成服務單例
if (_iFlySpeechSynthesizer ==
nil) {_iFlySpeechSynthesizer =
[IFlySpeechSynthesizer sharedInstance];
}
_iFlySpeechSynthesizer.delegate =
self;
//設置語速1-100
[_iFlySpeechSynthesizer setParameter:instance.speed forKey:[IFlySpeechConstant SPEED]];
//設置音量1-100
[_iFlySpeechSynthesizer setParameter:instance.volume forKey:[IFlySpeechConstant VOLUME]];
//設置音調1-100
[_iFlySpeechSynthesizer setParameter:instance.pitch forKey:[IFlySpeechConstant PITCH]]; //設置采樣率
[_iFlySpeechSynthesizer setParameter:instance.sampleRate forKey:[IFlySpeechConstant SAMPLE_RATE]];
//設置發音人[_iFlySpeechSynthesizer setParameter:instance.vcnName forKey:[IFlySpeechConstant VOICE_NAME]];
?
5 觸發語音合成
添加一個輸入框,一個button,button的響應時間是將輸入框中的文本內容讀出來.
if ([self.VoiceText.text isEqualToString:
@""]) {return;
}
if (_audioPlayer != nil && _audioPlayer.isPlaying ==
YES) {[_audioPlayer stop];}
_synType =
NomalType;
self.hasError =
NO;
[NSThread sleepForTimeInterval:0.05];
_iFlySpeechSynthesizer.delegate =
self;
[_iFlySpeechSynthesizer startSpeaking:self.VoiceText.text]; ?
轉載于:https://www.cnblogs.com/guzhen/p/5128793.html
總結
以上是生活随笔為你收集整理的讯飞语音识别的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。