仿QQ变声功能的实现

news/2024/11/15 6:03:26/

Android ndk开发之QQ变声

要做出QQ变声的效果,用Android系统自带的MediaPlayer是无法实现的,只能另想他法了。听说汤姆猫是用SoundTouch实现的,而QQ是用FMOD实现的,就根据网上的教程,自己捣鼓ndk好几天,终于实现了,但是效果不是很理想。
FMOD是老外为游戏开发者准备的革命性音频引擎,说它支持很多功能,包括音效的处理,声道变化,音调等,,去fmod官网下载,首先得先注册一个账户,国内用户注册不了,需要翻墙才能注册,下载后解压,把需要的c文件放到jni目录下如图:配置Android.mk,写个native方法用来播放音频。中间会遇到各种问题,这里就不一一列举了,下面贴出源码。

  • 1.本地native方法
public class TestNdk {static {System.loadLibrary("fmod");System.loadLibrary("fmodL");System.loadLibrary("voicer");}public static final int MODE_NORMAL = 0;public static final int MODE_LUOLI = 1;public static final int MODE_DASHU = 2;/*** 音效处理* @param path sd卡上音频路径* @param mode 音效模式*/public static native void fix(String path, int mode);}
  • Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := fmod
LOCAL_SRC_FILES := libfmod.so 
include $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS)
LOCAL_MODULE    := fmodL
LOCAL_SRC_FILES := libfmodL.so 
include $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS)
LOCAL_MODULE    := voicer
LOCAL_SRC_FILES := voicer.cpp
LOCAL_C_INCLUDES  += $(LOCAL_PATH)/inc
LOCAL_LDLIBS := -llog
LOCAL_CPP_FEATURES :=exceptions
LOCAL_SHARED_LIBRARIES := fmod fmodLinclude $(BUILD_SHARED_LIBRARY)
  • voicer.cpp
#include "com_daqiang_voicer_TestNdk.h"
#include <stdlib.h>
#include "jni.h"
#include <fmod.hpp>
#include <android/log.h>
#include <unistd.h>//unix 标准头文件,这里用到了sleep函数using namespace FMOD;//宏定义
#define LOGI(FORMAT,...) __android_log_print(ANDROID_LOG_INFO,"daqiang",FORMAT,##__VA_ARGS__)
#define LOGE(FORMAT,...) __android_log_print(ANDROID_LOG_ERROR,"daqiang",FORMAT,##__VA_ARGS__)#define MODE_NORMAL  0
#define MODE_LUOLI 1
#define MODE_DASHU 2
/** Class:     com_daqiang_json_voicer_TestNdk* Method:    fix* Signature: (Ljava/lang/String;I)V*/
JNIEXPORT void JNICALL Java_com_daqiang_voicer_TestNdk_fix(JNIEnv *env,jclass jcls, jstring path, jint mode) {System *system;Sound *sound;void *extradriverdata; //Driver specific data that can be passed to the output plugin. For example the filename for the wav writer plugin. See FMOD_OUTPUTTYPE for what each output mode might take here. Optional. Specify 0 or NULL to ignore.Channel *channel;bool isPlaying = true; //是否正在播放,默认为trueDSP *dsp; //音效try {//初始化System_Create(&system);//maxchannels:最多使用的频道数 这里32system->init(32, FMOD_INIT_NORMAL, extradriverdata);//要播放声音,先创建声音const char* path_cstr = env->GetStringUTFChars(path, NULL);system->createSound(path_cstr, FMOD_DEFAULT, NULL, &sound);LOGI("路径:%s", path_cstr);switch (mode) {case MODE_NORMAL: //正常system->playSound(sound, 0, false, &channel);break;case MODE_LUOLI: //萝莉//音效system->createDSPByType(FMOD_DSP_TYPE_PITCHSHIFT, &dsp);//指定音效的参数 (Type:float) - Pitch value.  0.5 to 2.0.  Default = 1.0. 0.5 = one octave down, 2.0 = one octave up.  1.0 does not change the pitch.dsp->setParameterFloat(FMOD_DSP_PITCHSHIFT_PITCH, 2);system->playSound(sound, 0, false, &channel);channel->addDSP(0, dsp);break;case MODE_DASHU:	//大叔//音效system->createDSPByType(FMOD_DSP_TYPE_PITCHSHIFT, &dsp);//指定音效的参数 (Type:float) - Pitch value.  0.5 to 2.0.  Default = 1.0. 0.5 = one octave down, 2.0 = one octave up.  1.0 does not change the pitch.dsp->setParameterFloat(FMOD_DSP_PITCHSHIFT_PITCH, 0.5);system->playSound(sound, 0, false, &channel);channel->addDSP(0, dsp);break;}} catch (...) {LOGE("%s", "异常");goto end;}//更新,没有更新是不会播放声音的system->update();//播放声音异步,如果没有播放完,//	等待播放完成while (isPlaying) {channel->isPlaying(&isPlaying);//休眠,单位:微秒usleep(1000 * 1000);	//1秒}end:LOGI("%s", "播放结束");system->close();system->release();}

android studio 3.0 重新编译了代码:源码下载地址地址(只是简单的界面,几个按钮,音效处理):https://download.csdn.net/download/u014389362/10753612

安卓java代写

java安卓程序代做,安卓程序代做,专业程序代写,有需要请加QQ: 2103752102

我的淘宝店铺


http://www.ppmy.cn/news/544975.html

相关文章

java实现变声器--变声萝莉

编写java变声器需要做的前期准备 安装 ffmgeg 下载地址 Releases BtbN/FFmpeg-Builds GitHub win系统下载 ffmpeg-N-103272-g7bba0dd638-win64-gpl.zip 配置环境变量到 bin目录 新建maven程序加入两个引用 <!-- https://mvnrepository.com/artifact/com.github.st-h/…

matlab调制变声,MATLAB变声程序代码

% ct1 clear all,close all, clc; % 定义常数 FL 80; % 帧长 WL 240; % 窗长 P 10; % 预测系数个数 [s,fs] wavread(sunday_2.wav); % 载入语音s s s/max(s); %归一化 L length(s); % 读入语音长度 FN floor(L/FL)-2; % 计算帧数 % 预测和重建滤波器 exc zeros(L,1); %…

Android 端音频变声方案

音频变声实质上是通过调整 PCM 数据的音调、节拍等属性&#xff0c;实现听感上的变化。如果是 mp3、aac 等压缩音频&#xff0c;则需提前解码成 PCM 数据&#xff0c;Android 端可以通过 MediaExtractor 及 MediaCodec 解码得到 PCM&#xff0c;但调整音调、节拍仅靠 Android a…

实时语音变声技术原理解析:“大叔变小萝莉”

游戏社交化是近年来游戏行业发展的重要趋势&#xff0c;如何提高游戏的社交属性已成为各大游戏厂商游戏策划的重要组成部分。游戏中玩家的互动形式也不再止于语音聊天&#xff0c;有了更为高阶的需求&#xff0c;比如&#xff1a;玩家在“吃鸡”的时候&#xff0c;会通过外带的…

MATLAB变声器程序

clear;clc; [s,fs,] audioread(‘61.m4a’); % 载入语音s s(1:3000)s(1:3000)randn(3000,1)*eps; s s/max(s); %归一化 L length(s); % 读入语音长度 figure(1); subplot(211);plot(s);title(‘原始语音信号波形’) subplot(212);plot(abs(s));title(‘原始语音信号频谱’) …

光变声

为何变&#xff1f; 今年智能车竞赛中的信标组的导引信号发生了改变&#xff0c;由原来的光&#xff0c;变成了声&#xff08;还有射频信号&#xff09;&#xff0c;除了传承智能车竞赛赛题永远在变化的传统&#xff0c;还有阻断…&#xff08;此处省略三千字&#xff09;。 …

语音模块:pyttsx变声项目

目录 一、说明 二、安装 三、基本用法 四、结论 一、说明 程序员们好&#xff0c;我们将在本教程中看到如何使用 Python 中的 pyttsx3 将语音转换为文本。也可以将人的语音实现变音、变速等处理。 pyttsx3 库是 Python 中的文本到语音转换库。该库离线工作&#xff0c;使其…

怎样将音频变声?三分钟教会你

音频变声是一种常见的音频处理方式&#xff0c;可以对人声或音乐进行特殊处理&#xff0c;使其声音产生不同的效果。它的应用广泛&#xff0c;像是音乐制作人可能需要使用音频变声来改变歌手的声音&#xff0c;使其更加独特或与歌曲的风格相匹配。例如&#xff0c;将男歌手的声…