文字转语音

2021-12-07  本文已影响0人  林希品

用系统的文字转语音功能

/*
专门用来保存单例代码
*/
// @interface
#define singleton_interface(className) \
+ (className *)shared##className;


// @implementation
#define singleton_implementation(className) \
static className *_instance; \
+ (id)allocWithZone:(NSZone *)zone \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [super allocWithZone:zone]; \
}); \
return _instance; \
} \
+ (className *)shared##className \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [[self alloc] init]; \
}); \
return _instance; \
}

XPAppSpeechTool.h

//
//  XPAppSpeechTool.h
//  XPAppBaseProject
//
//  Created by LinXipin on 2021/12/7.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface XPAppSpeechTool : NSObject

singleton_interface(XPAppSpeechTool);

//设置音高,[0.5 - 2] 默认 = 1
//AVSpeechUtteranceMaximumSpeechRate
//AVSpeechUtteranceMinimumSpeechRate
//AVSpeechUtteranceDefaultSpeechRate
/**utterance_pitchMultiplier*/
@property (assign, nonatomic) float utterance_pitchMultiplier;

//设置音量,[0-1] 默认 = 1
/**utterance_pitchMultiplier*/
@property (assign, nonatomic) float utterance_volume;


- (void)SpeechToolWithSpeechString:(NSString *)SpeechString;

@end

NS_ASSUME_NONNULL_END

XPAppSpeechTool.m

//
//  XPAppSpeechTool.m
//  XPAppBaseProject
//
//  Created by LinXipin on 2021/12/7.
//

#import "XPAppSpeechTool.h"
#import <AVFoundation/AVSpeechSynthesis.h>

@interface XPAppSpeechTool ()<AVSpeechSynthesizerDelegate>

/**avSpeaker*/
@property (strong, nonatomic) AVSpeechSynthesizer *avSpeaker;
/**utterance*/
@property (strong, nonatomic) AVSpeechUtterance *utterance;

/**SpeechString*/
@property (copy, nonatomic) NSString *speechString;

@end

@implementation XPAppSpeechTool

+(instancetype)sharedXPAppSpeechTool
{
    static dispatch_once_t once;
    static id sharedInstance;
    dispatch_once(&once, ^{
        sharedInstance = [[self alloc]init];
    });
    return sharedInstance;
}

- (void)SpeechToolWithSpeechString:(NSString *)SpeechString {
    self.avSpeaker = nil;
    self.utterance = nil;
    self.speechString = SpeechString;
    //开始朗读
    [self.avSpeaker speakUtterance:self.utterance];

}

/**avSpeaker*/
- (AVSpeechSynthesizer *)avSpeaker
{
    if (!_avSpeaker) {
        //初始化语音合成器
        _avSpeaker = [[AVSpeechSynthesizer alloc] init];
        _avSpeaker.delegate = self;

    }
    return _avSpeaker;
}

/**utterance*/
- (AVSpeechUtterance *)utterance
{
    if (!_utterance) {
        _utterance = [[AVSpeechUtterance alloc] initWithString:self.speechString];
        //设置语速,语速介于AVSpeechUtteranceMaximumSpeechRate和AVSpeechUtteranceMinimumSpeechRate之间
        //AVSpeechUtteranceMaximumSpeechRate
        //AVSpeechUtteranceMinimumSpeechRate
        //AVSpeechUtteranceDefaultSpeechRate
        _utterance.rate = 0.5;

        //设置音高,[0.5 - 2] 默认 = 1
        //AVSpeechUtteranceMaximumSpeechRate
        //AVSpeechUtteranceMinimumSpeechRate
        //AVSpeechUtteranceDefaultSpeechRate
        _utterance.pitchMultiplier = self.utterance_pitchMultiplier?:1;

        //设置音量,[0-1] 默认 = 1
        _utterance.volume = self.utterance_volume?:1;

        //读一段前的停顿时间
        _utterance.preUtteranceDelay = 1;
        //读完一段后的停顿时间
        _utterance.postUtteranceDelay = 1;

        //设置声音,是AVSpeechSynthesisVoice对象
        //AVSpeechSynthesisVoice定义了一系列的声音, 主要是不同的语言和地区.
        //voiceWithLanguage: 根据制定的语言, 获得一个声音.
        //speechVoices: 获得当前设备支持的声音
        //currentLanguageCode: 获得当前声音的语言字符串, 比如”ZH-cn”
        //language: 获得当前的语言
        //通过特定的语言获得声音
        AVSpeechSynthesisVoice *voice = [AVSpeechSynthesisVoice voiceWithLanguage:@"zh-CN"];
        //通过voicce标示获得声音
        //AVSpeechSynthesisVoice *voice = [AVSpeechSynthesisVoice voiceWithIdentifier:AVSpeechSynthesisVoiceIdentifierAlex];
        _utterance.voice = voice;
    }
    return _utterance;
}


@end


使用

    [[XPAppSpeechTool sharedXPAppSpeechTool] SpeechToolWithSpeechString:self.textView.text];
上一篇下一篇

猜你喜欢

热点阅读