iOS自帶文字轉語音功能,實現(xiàn)很簡單,接下來我們就一起來學習這個簡單酷炫的功能。
要實現(xiàn)文字轉語音,我們只需要簡單的幾個類,從本文你將學到:
- 將文字(漢語、英語等)轉化為語音輸出
- 掌握語音合成器:
AVSpeechSynthesizer,
語言設置:AVSpeechSynthesisVoice,
發(fā)聲對象:AVSpeechUtterance的使用 - 文字轉語音demo
其合成過程如下:由
AVSpeechSynthesisVoice設置語言環(huán)境,AVSpeechUtterance設置需要轉化的文字,并對語速、音調(diào)、音量等進行控制,最后由AVSpeechSynthesizer來進行播放。
-
AVSpeechSynthesisVoice
- 1、創(chuàng)建語言環(huán)境
//參數(shù)為需要設置的語言
AVSpeechSynthesisVoice *voice = [AVSpeechSynthesisVoice voiceWithLanguage:@"zh-TW"];
//獲取當前設置的語言
[AVSpeechSynthesisVoice currentLanguageCode];
- 2、獲取支持的語言
//通過如下方法可以查看所支持的語言,可根據(jù)需要從中選取所需語言
NSArray *voices = [AVSpeechSynthesisVoice speechVoices];
常用語言如下:
en-GB//英語(英式)
en-US//英語(美式)
zh-CN//漢語(普通話)
zh-HK//漢語(粵語)
zh-TW//漢語(臺灣)
-
AVSpeechUtterance
// 創(chuàng)建語音合成器
AVSpeechSynthesizer *synthesizer = [[AVSpeechSynthesizer alloc] init];
// 實例化發(fā)聲的對象
AVSpeechUtterance *utterance = [AVSpeechUtterance speechUtteranceWithString:@"我有一只小毛驢"];
//語言,為AVSpeechSynthesisVoice的一個對象
utterance.voice = voice;
//語速,0~1
utterance.rate = 0.5;
//聲音,0~1
utterance.volume = 1;
//音調(diào)0.5~2
utterance.pitchMultiplier = 1;
//播放前的延時
utterance.preUtteranceDelay = 3;
//播放后的延時,一般用于設置連續(xù)播放多段文字的間隔
utterance.postUtteranceDelay = 1;
-
AVSpeechSynthesizer
- 使用
AVSpeechSynthesizer *synthesizer = [[AVSpeechSynthesizer alloc] init];
//播放
[synthesizer speakUtterance:utterance];
- 方法介紹
//開始播放
- (void)speakUtterance:(AVSpeechUtterance *)utterance;
//停止播放,調(diào)用此方法會立刻停止,并清空utterance隊列
- (BOOL)stopSpeakingAtBoundary:(AVSpeechBoundary)boundary;
//暫停播放
- (BOOL)pauseSpeakingAtBoundary:(AVSpeechBoundary)boundary;
//繼續(xù)播放
- (BOOL)continueSpeaking;
需要說明的是調(diào)用speakUtterance:方法時其實是把utterance添加到播放隊列,synthesizer會從該隊列里面順序取出utterance逐個播放,也就是我們可以一次性添加多個utterance,播放時則會順序播放。
- 3.代理方法,如有需要可以在代理 房中做一些處理
- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didStartSpeechUtterance:(AVSpeechUtterance *)utterance {
NSLog(@"開始:%@",utterance.speechString);
}
- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didPauseSpeechUtterance:(AVSpeechUtterance *)utterance {
NSLog(@"暫停:%@",utterance.speechString);
}
- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didCancelSpeechUtterance:(AVSpeechUtterance *)utterance {
NSLog(@"取消:%@",utterance.speechString);
}
- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer willSpeakRangeOfSpeechString:(NSRange)characterRange utterance:(AVSpeechUtterance *)utterance {
NSLog(@"將要開始:%@",utterance.speechString);
}
- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didContinueSpeechUtterance:(AVSpeechUtterance *)utterance {
NSLog(@"繼續(xù):%@",utterance.speechString);
}
- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didFinishSpeechUtterance:(AVSpeechUtterance *)utterance {
NSLog(@"完成:%@",utterance.speechString);
}
寫了一個簡單的demo測試了一下,demo中僅有兩個類,FireSpeecher用于播放控制,FireVoiceModely用于設置需要播放低文字及相關屬性的配置:
1 FireSpeecher類:
typedef NS_ENUM(NSInteger, PauseType) {
PauseTypeImmediate,//立刻停止
PauseTypeByWord//讀完本字(單詞)后再停止
};
@interface FireSpeecher : NSObject
/**
暫停或者停止類型
*/
@property (nonatomic, assign) PauseType pauseType;
/**
初始化
@param models 需要轉化的文字Model
@return FireSpeecher對象
*/
- (instancetype)initWithModels:(NSArray <FireVoiceModel *>*)models;
/**
播放
@return YES-->播放成功,NO-->播放失敗
*/
- (BOOL)speech;
/**
暫停播放
@return YES-->暫停成功,NO-->暫停失敗
*/
- (BOOL)pausedSpeech;
/**
停止
@return YES-->停止成功,NO-->停止失敗
*/
- (BOOL)stopeSpeech;
/**
繼續(xù)播放
@return YES-->繼續(xù)播放成功,NO-->繼續(xù)播放失敗
*/
- (BOOL)contiueSpeech;
2 FireVoiceModel類:
typedef NS_ENUM(NSInteger, LanguageType) {
LanguageTypeDefault,//默認(普通話)
LanguageTypeCH,//中文(普通話)
LanguageTypeHK,//香港(粵語)
LanguageTypeTW,//中文(臺灣)
LanguageTypeUS,//英語(美式)
LanguageTypeEN//英語(英式)
};
@interface FireVoiceModel : NSObject
/**
要說的句子
*/
@property (nonatomic , copy) NSString *string;
/**
語言類型
*/
@property (nonatomic, assign) LanguageType languageType;
/**
說話速率,0~1,默認0.5
*/
@property (nonatomic, assign) CGFloat rate;
/**
音調(diào),0.5~2.0,默認1.0
*/
@property (nonatomic, assign) CGFloat pinch;
/**
音量,0~1,默認為1
*/
@property (nonatomic, assign) CGFloat volume;
/**
說話前的時間,默認為0
*/
@property (nonatomic, assign) NSTimeInterval preDelay;
/**
說話后的延時時間,默認為0
*/
@property (nonatomic, assign) NSTimeInterval postDelay;
使用就很簡單了,語言默認中文普通話,包括語速、音調(diào)可以在model中對每句話單獨進行設置:
NSMutableArray *array = [NSMutableArray arrayWithCapacity:5];
for (int i = 0; i < 5; i ++) {
FireVoiceModel *model = [[FireVoiceModel alloc] init];
model.string = @"哈哈";
model.postDelay = 1;
[array addObject:model];
}
FireSpeecher *speecher = [[FireSpeecher alloc] initWithModels:array];
if ([speecher speech]) {
NSLog(@"開講啦");
}else {
NSLog(@"出錯啦");
}