前言:很久没写东西了,最近项目需要用到语音识别,需要做一个输入语音,根据声音的分贝大小,控制波纹振幅的动画,看了别人的轮子,感觉效果不错。最近比较咸鱼就自己摸索着大概模仿实现了一下。代码并不复杂请耐心观看。

效果图:

效果.GIF

实现思路:

1、首先获取输入声音的分贝大小变化值。

2、绘制一条波纹曲线(曲线需具备两个性质,①能通过一个值控制曲线绘制的弧度,②实时平移实现流动效果)。

3、波纹曲线根据声音分贝大小控制振幅。

现在按照思路来一步一步实现。

1、声音输入并获取分贝大小。

简单音频处理首先想到的就是使用AVFoundation,使用起来比较简单,我们需要的效果能实现,像AudioToolbox 的AudioQueue虽然强大但是学习成本太高。

使用AVFoundation的AVAudioRecorder来实现录音及获取分贝大小。

1)、设置录音参数。

- (NSDictionary *)audioParamSetting {

NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc]init];

//设置录音格式

[recordSetting setValue:[NSNumber numberWithInt:kAudioFormatLinearPCM ] forKey:AVFormatIDKey];

//设置录音采样率(Hz) 如:AVSampleRateKey==8000/44100/96000(影响音频的质量)

[recordSetting setValue:[NSNumber numberWithFloat:8000] forKey:AVSampleRateKey];

//录音通道数 1 或 2

[recordSetting setValue:[NSNumber numberWithInt:1] forKey:AVNumberOfChannelsKey];

//线性采样位数 8、16、24、32

[recordSetting setValue:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];

//录音的质量

[recordSetting setValue:[NSNumber numberWithInt:AVAudioQualityHigh] forKey:AVEncoderAudioQualityKey];

return recordSetting;

}

2)、设置录音保存路径,并初始化AVAudioRecorder,进入录音准备状态。

- (void)_initVoice {

// 初始化录音参数

NSDictionary *recordSetting = [self audioParamSetting];

NSString *strUrl = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/Video.pcm", strUrl]];

NSError *error;

//初始化

audioRecorder = [[AVAudioRecorder alloc]initWithURL:url settings:recordSetting error:&error];

//开启音量检测

audioRecorder.meteringEnabled = YES;

audioRecorder.delegate = self;

// 设备开启录音模式

AVAudioSession *audioSession = [AVAudioSession sharedInstance];

[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];

[audioSession setActive:YES error:nil];

//创建录音文件,准备录音

BOOL prepareSuccess = [audioRecorder prepareToRecord];

NSLog(@"准备录音: %d", prepareSuccess);

}

现在只需要在点击开始时调用[audioRecorder record];方法就行了,相对停止调用[audioRecorder stop];

3)、获取声音分贝大小。

- (void)detectionVoice {

[audioRecorder updateMeters];//刷新音量数据

//获取音量的平均值 [recorder averagePowerForChannel:0];

//音量的最大值 [recorder peakPowerForChannel:0];

double lowPassResults = pow(10, (0.1 * [audioRecorder peakPowerForChannel:0]));

NSLog(@"%f", lowPassResults);

}

通过AVAudioRecorder的peakPowerForChannel方法可以获取声音分贝峰值大小,但是获取值的范围是 -160~0 。声音峰值越大,越接近0。需要直接使用需要像上面做一下处理。

到此声音输入并获取声音分贝大小实现了。

接下来是实现 绘制一条波纹曲线(曲线需具备两个性质,①能通过一个值控制曲线绘制的弧度,②实时平移实现流动效果)。

首选熟悉的三角函数,y = Asin(ωx+φ)+ C

简单解释一下:

三角函数公式:y = Asin(ωx+φ)+ C

A:振幅,波纹在Y轴的高度,成正比,越大Y轴峰值越大。

ω:和周期有关,越大周期越短。

φ:横向偏移量,控制波纹的移动。

C:整个波纹的Y轴偏移量。

通过以上可以基本了解我们需要定义和控制的参数了。首先是波纹绘制显示的一个CAShapeLayer,再是一个控制振幅的参数CGFloat kRippleYMax,再是一个控制控制平移的偏移量CGFloat rippleOffset,最后是一个实时刷新的定时器CADisplayLink(控制波纹实时刷新,动起来)。

CADisplayLink简单说明

可能有些人对CADisplayLink比较陌生,下面简单说明一下CADisplayLink,还有和常用定时器NSTimer的区别。了解的可忽略以下说明。

CADisplayLink也是定时器的一种。是一个能让屏幕刷新率相同的频率,将内容画到屏幕上的定时器,设备屏幕刷新周期是1秒60次。

基本使用:

// 创建

CADisplayLink * displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(changeRipple)];

[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];

// 开始

self.displayLink.paused = NO;

// 停止

self.displayLink.paused = YES;

// 销毁

[self.displayLink invalidate];

和NSTimer区别:

1、原理不同。

每当屏幕显示内容刷新结束的时候,runloop就会向 CADisplayLink指定的target发送一次指定的selector消息,selector方法就会被调用一次。

NSTimer当设定的周期时间到达后,runloop会向指定的target发送一次指定的selector消息。

2、周期设置不同。

CADisplayLink在不设置frameInterval时默认是1秒调用60次。

NSTimer通过TimeInterval直接指定周期。

3、精确度不同。

CADisplayLink的精度更高,因为是通过屏幕刷新频率控制周期的,所有精度高。

NSTimer精度低,当前runloop阻塞时,会推迟到下一个runloop周期执行。所以NSTimer有tolerance设置定时器的延迟范围。

4、应用场景不同。

CADisplayLink一般适合配合UI刷新重绘使用。

NSTimer使用灵活,适合自定义循环任务。

理解CADisplayLink定时器后,下面开始绘制波纹曲线了。

首先设置懒加载波纹和定时器

#pragma mark 波纹

- (CAShapeLayer *)rippleLayer{

if (_rippleLayer == nil) {

CAShapeLayer * shapeLayer = [CAShapeLayer layer];

shapeLayer.fillColor = [UIColor colorWithRed:145/255.0f green:186/255.0f blue:248/255.0f alpha:1].CGColor;

shapeLayer.lineWidth = 2.0f;

shapeLayer.strokeColor = [UIColor whiteColor].CGColor;

[self.layer addSublayer:shapeLayer];

_rippleLayer = shapeLayer;

}

return _rippleLayer;

}

#pragma mark 定时器

- (CADisplayLink *)displayLink{

if (_displayLink == nil) {

CADisplayLink * displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(changeRipple)];

[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];

_displayLink = displayLink;

}

return _displayLink;

}

然后再自定义的波纹view的drawRect方法中开始绘制波纹曲线。曲线使用三角函数sin绘制路径。其中kRippleYMax可控制曲线的振幅,rippleOffset可控制曲线的偏移量。

- (void)drawRippleLayer{

CGMutablePathRef path = CGPathCreateMutable();

CGPathMoveToPoint(path, NULL, 0, rippleYOffset);

for (int i = 0; i <= KRippleWidth ; i++) {

CGFloat y = _kRippleYMax * sin(rippleCycle*i+self.rippleOffset) + rippleYOffset;

CGPathAddLineToPoint(path, NULL, i, y);

}

self.rippleLayer.path = path;

CGPathRelease(path);

}

然后再在定时器触发的方法中实时控制曲线平移。

#pragma mark 定时器刷新页面

- (void)changeRipple{

self.rippleOffset += rippleSpeed;

[self setNeedsDisplay];

}

现在获取声音的分贝峰值和波纹曲线都已经具备了,只需要定时获取声音分贝峰值大小,再根据峰值控制曲线就ok了。

以上只贴出主要功能实现代码,具体实现请参考Demo。

语音 声波转换 java_语音输入声波动画。AVAudioRecorder+三角函数,实现根据声音分贝控制振幅声波动画...相关推荐

  1. 语音 声波转换 java_声卡是实现声波/数字信号相互转换的一种硬件

    原标题:声卡是实现声波/数字信号相互转换的一种硬件 声卡是实现声波/数字信号相互转换的一种硬件.其基本功能是把来自话筒.磁带.光盘的原始声音信号加以转换,输出到耳机.扬声器.扩音机.录音机等声响设备, ...

  2. 语音识别方案 - 联想语音团队多场景实时语音文字转换方案

    [本文转载自联想乐语音论坛] 语音技术一直是人工智能的重要领域之一,其应用也日益广泛.语音技术本身也包括许多细分领域,如远场语音识别.副语言语音属性.说话人日志.声纹识别防欺骗攻击和零资源TTS等. ...

  3. 如何将文字转换成语音?文字转语音哪个工具好

    估计很多人一看到这个题目,马上就会站起来说,文字还能转语音?当然是啦,文字转语音有两种用处,一类是为了配视频的音频,另外一类是为了发布到音频自媒体平台,所有能用音频的自媒体平台都可以上传,这样就实现了 ...

  4. python语音转文字软件_python编写语音转文字软件|语音转文字工具免费版下载(语音批量转换文字) v2.0 最新版_数码资源网...

    没有专业的工具怎么能够将语音转换为文字呢?小编为大家提供了语音转文字工具免费版,一款通过Python编写语音转文字软件.用户通过使用语音转文字工具免费版,可以将语音批量转换文字,而且操作也是非常的简单 ...

  5. 怎么将文字转换成语音?

    将文字转换成语音的形式有很多种,有的时候我们可以将准备好的文字文件转换成语音的形式,下面小编就给大家简单介绍一下. 步骤一:将文字转换成语音的形式并不是很困难,我们首先需要将文字准备好,然后通过在浏览 ...

  6. 准备好的文字转换成语音的方法

    有些文件是可以进行转换的,当我们用文字的形式记录一些重要内容的时候,我们是可以将这些文字转换成语音的形式播放出来,那么我们是怎么进行文字转换成语音. 步骤一:我们可以通过搜索进入到迅捷语音云服务中去, ...

  7. 怎么把文字转换成语音?这里有简单的步骤讲解

    生活中我们经常会用到语音完成任务,但是我们有不想用自己的声音,这时,我们就能将文字转换成语音了,具体步骤怎么做呢?下面我们一起来学习下吧! 步骤一:打开文字转语音软件,在画布的左侧有三个工具栏[文字转 ...

  8. 图片转换成语音怎么弄?这几个方法教给你

    随着科技的发展,现在文字图片转语音已经成为一个普遍的需求.而在这个领域,有很多种文字图片转语音的软件,每款软件都有其自身的特点和优势.在本文中,我将和大家介绍文字图片转语音的软件有哪些,帮助读者找到最 ...

  9. 这三个方法让你实现文字转语音在线转换

    大家平时在逛街的时候,是否会听到商场或者店铺正在播放着一些商品促销的声音呢?这些声音有激情澎湃的:有温柔清晰的,能够很好的吸引顾客购买,不过这些声音其实都不是店家自己录制的,而是通过利用一些软件工具将 ...

最新文章

  1. python--安装PIL
  2. 拍人像的时候你喜欢哪种模特?
  3. ARM体系结构的特点
  4. 网络抓包工具之Wireshark
  5. SQL group by和count
  6. ps动感映像插件ImageMotion 1.3全新功能介绍
  7. java迅雷下载excel,Asp.net生成Excel文件并下载(更新:解决使用迅雷下载页面而不是文件的问题)...
  8. 最新小漫画Android下载,迷妹漫画安卓app2021最新版
  9. 笔试题-2023-燧原-数字IC设计【个人解答版】
  10. 嵌入式学习(3)ADC、DMA、通信方式
  11. java Excel转Pdf
  12. JEECG 商业版本号和开源版本号有什么差别呢?
  13. 1. 考研常见问题总结 从择校到复试
  14. 北大青鸟测试培训目录
  15. 文献速递第1期:fNIRS 的近期研究
  16. 莱茵特机器人奖金制度_TUV莱茵携手国机智能合作中国机器人规范制定
  17. 火影忍者ol手游今天未能连接服务器,火影忍者ol游戏上不去怎么办_火影忍者ol登录/安装失败解决方法...
  18. 便宜的Symbian手机应用开发公司
  19. Semi-supervised Semantic Segmentation Papers
  20. 一文搞定繁体字预处理和词云生成(wordcloud)

热门文章

  1. 格林威治 时间 转换北京使劲
  2. 提升教学质量,监督教室课堂秩序?这招小白也能轻松搞定
  3. Android使用lame将PCM文件转码为MP3文件
  4. 悬崖边上的舞者:橙光游戏
  5. 防止过拟合的几种常见方法
  6. 【剑指Offer(专项突破)】002. 二进制加法(Java实现) 详细解析
  7. Data Protector
  8. batch size设置
  9. 老人地摊淘到旧书 发现刊有老伴年轻照片(图)
  10. 如何正确使用Commvault的重复数据删除功能