Smule 借助 Oboe 音频库提升用户体验,助力音乐创作 | Android 开发者故事

Smule 借助 Oboe 音频库提升用户体验,助力音乐创作 | Android 开发者故事
www.zeeklog.com  - Smule 借助 Oboe 音频库提升用户体验,助力音乐创作 | Android 开发者故事

作者 / Smule 工程团队: David Gayle、Chris Manchester、Mark Gills、Trayko Traykov、Randal Leistikow、Mariya Ivanova。

Smule 采用 Oboe 音频库提升录制率

作为目前下载量排名前列的唱歌类应用,Smule Inc. 一直致力于投入大量资源来提升其应用的 Android 体验,以提高整体音频质量。具体而言就是减少延迟时间,让歌手在表演时能够通过耳机听到自己的声音。擅长音频和视频技术的团队在 2021 年很大一部分时间都忙于必需的提升工作,将逾千万 Android 用户使用的 Smule 应用从使用 OpenSL 音频 API 转换为使用 Oboe 音频库,从而使录制完成率提高了约 10% 以上。

  • Smule
    https://play.google.com/store/apps/details?id=com.smule.singandroid

简介

Smule Inc. 是卡拉 OK 应用的潮流企业,旗下的应用每天帮助数百万用户演唱最爱的歌曲,并分享表演。Smule 应用超越了传统的卡拉 OK,专注于共同创作,为用户创造了独一无二的机会,可以与朋友、平台上的其他歌手及其最喜欢的音乐人分享音乐和合作。而音频质量至关重要,Smule 团队在 2020 年看到了在 Android 平台提升体验的潜力。

www.zeeklog.com  - Smule 借助 Oboe 音频库提升用户体验,助力音乐创作 | Android 开发者故事

Smule 使用的旧版 OpenSL 虽然支持全球市场的各种设备,但不太适合利用新设备的高速硬件。Smule 开发团队认为,升级音频系统是必要且合乎逻辑的改进。

Oboe 发布策略

Smule 曾面对两种可行的改进途径,第一种是针对 AAudio 进行改进,这是 Android O 中引入的高性能 Android C 音频 API,专为需要低延迟的应用而设计。第二种是采用在内部同时封装了 AAudio 和 OpenSL 的 Oboe。经过细致评估,Smule 开发团队选择了 Oboe,此方案具有易用的代码库、广泛的设备兼容性和强大的社区支持,可最大限度减少延迟时间,并充分利用可用的原生音频。

  • AAudio
    https://developer.android.google.cn/ndk/guides/audio/aaudio/aaudio
  • Oboe
    https://developer.android.google.cn/games/sdk/oboe

改用 Oboe 意味着在应用架构和技术上将发生重大的变化。因此,Smule 在更新过程中采取了谨慎的做法,有计划地逐步发布,首先面向少数的特定设备型号以验证质量;然后逐渐地面向更多设备 (将少数使用 Oboe 时出现问题的设备恢复到 OpenSL)。这种循序渐进、有条不紊的方法可以最大限度地降低风险,并让开发团队能够在出现设备特定问题时及时处理。

改善音频质量体验

Smule 改用 Oboe 来帮助改善应用体验。他们希望大幅降低音频播放崩溃率,消除录制时的回响和噼啪声等问题,以及减少音频延迟。在之前的推文《》中曾介绍过,二十种最热门的设备使用 Oboe 后,平均延迟时间从 2017 年的 109 毫秒减少到现在的 39 毫秒。109 毫秒的监听延迟会听到干扰现场演唱的明显回响,而延迟 39 毫秒则低于实时应用可接受的阈值。当下高端设备的延迟时间都在 22 毫秒以内,这种一致性是一大优势。

Smule 使用 Oboe 后,或许是因为延迟时间更短,歌手借助 Smule 首屈一指的音频效果演唱时能通过耳机听到自己的声音,同时又没有回响,录制完成率因此得以提升。

利用 Oboe 专用的高效协作式 GitHub 门户,Google 团队发挥了重要作用,不但帮助 Smule 实现 Oboe 集成,还为其提供重要的数据洞察和支持。两家团队通力合作,完成了迄今最大的 Oboe 部署,数百万活跃用户受益匪浅。Smule 团队解决了某些 Oboe 代码问题,而 Google 团队与部分移动设备制造商一起进一步增强了 Oboe 的兼容性。

  • Oboe
    https://github.com/google/oboe/issues
对于歌手社区而言,音频质量至关重要,我们一起致力于帮助 Smule 提供最佳体验,并助力音乐创作,我们为此深感欣慰。
Smule 首席技术官 Eric Dumas

既然是大规模部署,自然会面临设备特定问题。例如,操作系统内置功能会导致原始音频流中出现回响声效,造成 Smule 不能正常应用自己的专利 DSP 算法和音频滤波器。Google 团队立即施以援手,迅速为开发库提供更新和补丁。Oboe 问题反馈的流程简单,描述明确,便于 Google 团队及时解决。

Smule 还克服了其他设备特定障碍,其中包括特定芯片组错误。比如,Oboe 需要单声道麦克风输入时,一些设备提供的是引入一个模拟单声道麦克风输入的立体声输入。Smule 在 Oboe 的 GitHub 中创建工单,以提供示例并使用 Oboe 测试应用重现此问题。

  • Oboe 的 GitHub
    https://github.com/google/oboe

Google 开发的 Oboe 测试器应用工具可帮助用户在实现过程中解决和标识问题。事实证明,此工具在测试 Oboe、AAudio 和 OpenSL ES 的许多功能、测试 Android 设备,以及衡量延迟时间和故障等方面特别有用。此应用可提供大量有助于模拟绝大部分音频设置的功能。Oboe 测试器还可用于自动化测试,方法是使用 Android Intent 从 Shell 脚本启动。由于集成涉及大量设备,Smule 非常依赖自动化测试。

  • Oboe 测试器应用
    https://github.com/google/oboe/tree/master/apps/OboeTester/docs

在 Smule 确信已解决设备特定问题,并且 Oboe 音频相当稳定后,Smule 改用大范围的对比测试发布方式。短短几周内,Smule 将使用 Oboe 的人群从目标设备的 10% 增加到 100%,这得益于 Oboe 在发布期间不断收到积极反馈和绿色 KPI 指标。

结果不言而喻,使用 Oboe 的 Smule 用户会唱更多歌,就这么简单。不重复的卡拉 OK 录制量以及合唱 (或二重奏) 增加了高达 8.07%,不重复的上传量增加了 3.84%,而演唱完成率则增加了 4.10% 以上。Smule 观察到,在 2021 年第三季度和第四季度,录制完成率增加了 10% 以上。

使用 Google 提供的 Firebase Crashlytics 工具,Smule 发现自 Oboe 全面应用以来,与音频相关的崩溃减少,应用更稳定,即便使用低端设备也如此。Smule 敬业的客服团队发现,与音频相关的投诉减少了 33%,其中包括 (非预期的) 机器人音效和回响等问题的投诉。

  • Firebase Crashlytics
    https://firebase.google.cn/docs/crashlytics

改用 Oboe 的决策已颇有成效。此应用不同以往,更稳定更出类拔萃,Smule 完全能够采用更新技术,进一步提升音频和硬件质量。最重要的是,Smule 用户可以更得心应手地制作音乐,这才是我们的使命。

欢迎您关注我们的微信公众号了解更多。

您可以通过下方二维码或在文章底部私信,向我们提交反馈,分享您喜欢的内容、发现的问题。您的反馈对我们非常重要,感谢您的支持!

www.zeeklog.com  - Smule 借助 Oboe 音频库提升用户体验,助力音乐创作 | Android 开发者故事
www.zeeklog.com  - Smule 借助 Oboe 音频库提升用户体验,助力音乐创作 | Android 开发者故事

点击屏末 | 阅读原文 | 即刻了解更多应用质量优化的相关内容


www.zeeklog.com  - Smule 借助 Oboe 音频库提升用户体验,助力音乐创作 | Android 开发者故事
www.zeeklog.com  - Smule 借助 Oboe 音频库提升用户体验,助力音乐创作 | Android 开发者故事
www.zeeklog.com  - Smule 借助 Oboe 音频库提升用户体验,助力音乐创作 | Android 开发者故事

Read more

SpringCloud实战【九】: SpringCloud服务间调用

SpringCloud实战【九】: SpringCloud服务间调用

目录 1 服务间调用 微服务的特点是服务数量特别多,服务和服务之间也需要有交互,这就涉及到服务间的调用,即服务与服务之间如何通信。提到服务与服务之间的通信,最通用的莫过于HttpClient,在其它的通信架构中基本都使用HttpClient来作为底层的通讯模型。在SpringCloud中依然可以使用HttpClient进行服务与服务调用,只不过如果采用HttpClient调用的话,会有一些弊端,例如: 如果同一个服务有多个负载的话,采用HttpClient调用时,没有办法处理负载均衡的问题。还有另一个问题就是HttpClient只是提供了核心调用的方法并没有对调用进行封装,所以在使用上不太方便,需要自己对HttpClient进行简单的封装。 在SpringCloud提供了两种方式来解决服务与服务通信的问题,RestTemplate和Feign。虽然从名字上看这两种调用的方式不同,但在底层还是和HttpClient一样,采用Http的方式进行调用的。只不过是对HttpClient进行的封装。下面就一起来探讨一下这两种方式的区别。 2 RestTemplate方式调用 2.1

By Ne0inhk
Log4j使用教程

Log4j使用教程

1 使用方法 日志是应用软件中不可缺少的部分,Apache的开源项目是一个功能强大的日志组件,提供方便的日志记录。在apache网站: 可以免费下载到Log4j最新版本的软件包。如果是maven项目可以直接引用: <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> 然后在src同级创建并设置log4j.properties ############# # 输出到控制台 ############# # log4j.rootLogger日志输出类别和级别:只输出不低于该级别的日志信息DEBUG < INFO < WARN < ERROR <

By Ne0inhk
【算法面试宝典】算法的时间复杂度与空间复杂度

【算法面试宝典】算法的时间复杂度与空间复杂度

目录 1 算法概述 1.1 算法定义 算法(Algroithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或者不适合与某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用时间复杂度和空间复杂度来衡量。 算法中的指令描述的是一个计算,当其运行是能从一个初始状态和初始输入开始,经过一系列有限而清晰定义的状态,最终产生输出并停止于一个终态。一个状态到另一个状态的转移不一定的确定的。随机化算法在内的一些算法,包含了一些随机输入。 1.2 算法的特性 一个算法应该具有一下5个重要的特性: 有穷性(Finiteness) 算法的又穷性是指算法必须在执行有限的步骤后终止。 确切性(Definiteness) 算法的每一步骤必须有确切的定义。 输入项(Input)      一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定义了初始条件。

By Ne0inhk
【算法面试宝典】十大经典排序算法

【算法面试宝典】十大经典排序算法

目录 1 排序算法的分类 排序是将一组无序的数字元素,经过重新排列后形成的一组有序的数字元素,可以是升序也可以是降序。排序算法是对数字元素排列的过程中经过的一些列运算。根据是否需要比对,可以把排序算法分为 比较类排序算法 和 非比较类排序算法。 * 比较类排序算法:通过比较来确定元素之间的相对顺序。比较类排序算法的时间复杂度不能突破 O(NlogN),所以也成为非线性时间比较类排序。 * 非比较类排序算法:不通过比较来确定元素之间的相对顺序。非比较类排序算法可以突破比较类排序算法时间复杂度的下界,以线性时间运行,因此也称为线性时间非比较类排序。 常见的十大排序算法归类如下所示: 我们常用的冒泡排序、快速排序、插入排序、希尔排序、选择排序、堆排序、归并排序都属于比较类排序算法,因为要通过比较来判断元素的顺序。技术排序、桶排序、基数排序都属于非比较类排序算法。下面我们一起来拆解一下这十种排序算法。 2 十大排序算法详解 2.1 冒泡排序 2.3.1 解题思路 原理:比较两个相邻的元素,将大的元素交换到右边。 思路:依次比较两个相邻的元素,

By Ne0inhk