AVFoundation--文字轉語音

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

    1. 使用
AVSpeechSynthesizer *synthesizer = [[AVSpeechSynthesizer alloc] init];
//播放
[synthesizer speakUtterance:utterance];
    1. 方法介紹
//開始播放
- (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(@"出錯啦");
    }

Demo地址

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 最近項目剛剛交付,偶然間用到了語音播報和語音搜索的功能。語音搜索我用的是訊飛的demo,感覺效果還不錯,感興趣的話...
    奔跑的小螞蟻_8b28閱讀 8,656評論 13 6
  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 15,658評論 4 61
  • (這是許6569 365日小能熊寫作計劃第71篇文章) 聽上一屆的哥哥說,每年都有春游。我心花怒放。啥時候去呢?...
    許6569閱讀 1,251評論 3 1
  • 文:陳奕。 萬寶路小姐并不是叫萬寶路,因為她喜歡抽煙,所以才給她取這個名字,原本是想叫她香煙小姐的,但是這個名字并...
    深西陳奕閱讀 946評論 2 9
  • 金。 金色。大片大片的金。 沒有惡心作嘔的味道,沒有難以下腳的墨綠苔蘚,沒有嗡嗡作響的飛蟲。 青行燈愣住了。她想過...
    就來箱旺仔牛奶吧閱讀 989評論 0 5

友情鏈接更多精彩內(nèi)容