Android 3 Android Chapter 3 Sound Sensing Android

  • Slides: 46
Download presentation
Android = 人+计算 普适环境 第 3章 声音感知与Android实践 Chapter 3: Sound Sensing & Android Practice

Android = 人+计算 普适环境 第 3章 声音感知与Android实践 Chapter 3: Sound Sensing & Android Practice

Mobisys’ 09 Dartmouth College Sound. Sense项目 感知 测量 分类 推演 Android & Pervasive Computing

Mobisys’ 09 Dartmouth College Sound. Sense项目 感知 测量 分类 推演 Android & Pervasive Computing -3 -

感知 — 读取基础(raw)数据 Android & Pervasive Computing -4 -

感知 — 读取基础(raw)数据 Android & Pervasive Computing -4 -

Android音频采集 n 就是用手机录制一段声音 怎么下手? 想一想肯定还是Manager或封装好的对象 n 看一看核心代码 Media. Recorder recorder = new Media. Recorder();

Android音频采集 n 就是用手机录制一段声音 怎么下手? 想一想肯定还是Manager或封装好的对象 n 看一看核心代码 Media. Recorder recorder = new Media. Recorder(); recorder. set. Audio. Source(Media. Recorder. Audio. Source. MIC); recorder. set. Output. Format(Media. Recorder. Output. Format. THREE_GPP); recorder. set. Audio. Encoder(Media. Recorder. Audio. Encoder. AMR_NB); recorder. set. Output. File("/sdcard/myrec 1. amr"); Android & Pervasive Computing -5 -

Android音频采集的细节 Media. Recorder. Audio. Source. xxx n 设置采集源: set. Audio. Source int MIC(int DEFAULT):主Microphone音频源

Android音频采集的细节 Media. Recorder. Audio. Source. xxx n 设置采集源: set. Audio. Source int MIC(int DEFAULT):主Microphone音频源 int VOICE_CALL:话筒(Voice call) uplink + downlink音频源 int VOICE_DOWNLINK:话筒(Voice call) downlink(Rx)音频源 int VOICE_UPLINK: 话筒(Voice call) uplink(Tx) 音频源 int VOICE_RECOGNITION:进行语音识别的 Microphone音频源(如果有,没有就是DEFAULT) int CAMCORDER:和摄像机同一方向上的 Microphone源(如果有,没有就是DEFAULT) Android & Pervasive Computing -6 -

Android音频采集的细节 Media. Recorder. Output. Format. xxx n 设置内容输出格式: set. Output. Format int MPEG_4(int DEFAULT):产生*.

Android音频采集的细节 Media. Recorder. Output. Format. xxx n 设置内容输出格式: set. Output. Format int MPEG_4(int DEFAULT):产生*. mp 4文件 Moving Picture Expert Group,MPEG-4是为 播放高质量流媒体视频而专门设计的,实现能 接近于DVD画质的小体积视频文件 int RAW_AMR: 产生*. amr文件 AMR(Adaptive Multi-Rate)是用在手机上的一 种语音压缩格式,AMR压缩率高但音质差 int THREE_GPP: 产生*. 3 gp文件 3 GP(3 rd Generation Partnership Project)是 专为手机播放视频而开发的通用视频格式 Android & Pervasive Computing -7 -

Android音频采集的细节 Media. Recorder. Audio. Encoder. xxx n 设置音频编码方式: set. Audio. Encoder int AMR_NB(int DEFAULT):(Narrowband)

Android音频采集的细节 Media. Recorder. Audio. Encoder. xxx n 设置音频编码方式: set. Audio. Encoder int AMR_NB(int DEFAULT):(Narrowband) audio codec(编码格式) AMR全称Adaptive Multi-Rate,自适应多速率编码, 主要用于移动设备的音频,压缩比较大,质量较差, 多用于人声和通话。 1. AMR-NB:相对于WB而言,语音带宽范围: 300 - 3400 Hz, 8 KHz抽样 2. AMR-WB:AMR Wide. Band,语音带宽范围: 50 - 7000 Hz,16 KHz抽样 Android只支持AMR_NB格式 Android & Pervasive Computing -8 -

Android支持的多媒体格式(手册) Android & Pervasive Computing -9 -

Android支持的多媒体格式(手册) Android & Pervasive Computing -9 -

Android音频采集测试实例 当然是把这些代码放在两个 按钮的点击事件:“开始录 制”和“结束录制” n 录一段音试一试 recorder. prepare(); recorder. start(); . . . ;

Android音频采集测试实例 当然是把这些代码放在两个 按钮的点击事件:“开始录 制”和“结束录制” n 录一段音试一试 recorder. prepare(); recorder. start(); . . . ; recorder. stop(); recorder. reset(); recorder. release(); n 播放这一段录音 Media. Player media. Player = new Media. Player(); media. Player. set. Data. Source("/sdcard/myrec 1. amr"); media. Player. start(); n 在真机上试一试,当然别忘了把权限打开 <uses-permission android: name="android. permission. RECORD_AUDIO"/> Android & Pervasive Computing - 10 -

音频数据测量的通常结构 注意:sound event通常是noncontinuous,所以“inbetween” frames也属于 admission 分帧(Framing) 帧可以认为是声音 的语义单位,在语 音识别中一帧通常 为 25 -46 ms Android

音频数据测量的通常结构 注意:sound event通常是noncontinuous,所以“inbetween” frames也属于 admission 分帧(Framing) 帧可以认为是声音 的语义单位,在语 音识别中一帧通常 为 25 -46 ms Android & Pervasive Computing 进入控制(Admission Control) rms=sqrt( xi 2/n ) Root Mean Square(RMS) xi是振幅,RMS表征能量大小 Hf=- pilog(pi) FFT Entropy(熵) pi是频率,Hf表征频率分布 该帧是否需要处理,silent, white noise无需处理 - 12 -

对AMR数据进行framing n AMR文件头 单声道:单个Channel AMR-NB: "#!AMRn" (0 x 2321414 D 520 A 16进制) AMR-WB:

对AMR数据进行framing n AMR文件头 单声道:单个Channel AMR-NB: "#!AMRn" (0 x 2321414 D 520 A 16进制) AMR-WB: "#!AMR-WBn" (0 x 2321414 D 522 D 57420 A 16进制) magic number 多声道:多个Channel channel描述 AMR-NB的魔数: "#!AMR_MC 1. 0n" (0 x 2321414 D 525 F 4 D 43312 E 300 A 16进制) AMR-WB的魔数: "#!AMR-WB_MC 1. 0n" (0 x 2321414 D 522 D 57425 F 4 D 43312 E 300 A 16进制) Android & Pervasive Computing - 14 -

对AMR数据进行framing n 多声道AMR文件的channel描述 0 1 2 3 28 29 30 31 … CHAN(几个声道) 保留(必须是

对AMR数据进行framing n 多声道AMR文件的channel描述 0 1 2 3 28 29 30 31 … CHAN(几个声道) 保留(必须是 0) n 用Ultra. Edit打开那个myrec 1. amr文件 23 21 41 4 D 52 0 A Android & Pervasive Computing AMR-NB: "#!AMRn" (0 x 2321414 D 520 A) - 15 -

对AMR数据进行framing n 再看看那个myrec 1. amr 3 C = 0011 1100 3 C就是那个帧头 Q =

对AMR数据进行framing n 再看看那个myrec 1. amr 3 C = 0011 1100 3 C就是那个帧头 Q = 1,不是坏帧;FT = 0111,编码模式为 7 Index Frame content #Bits in AMR Core Frame #Bits in Bit Stuffing 7 244 0 AMR 12. 2 kbit/s Android & Pervasive Computing - 17 -

对AMR数据进行framing n 开始分析myrec 1. amr中的数据帧 AMR 12. 2 Kbits/s,12200/(1000/20)/8 = 244/8 = 30. 5,所以是

对AMR数据进行framing n 开始分析myrec 1. amr中的数据帧 AMR 12. 2 Kbits/s,12200/(1000/20)/8 = 244/8 = 30. 5,所以是 31个字节 = 248 bits = 244 + 4 08 55 6 D 94 4 C 71 A 0 81 E 7 EA D 2 04 24 44 80 00 0 E CD 82 B 8 11 18 00 00 97 C 4 79 4 E 77 40 要算RMS和Hf需要声波的信息,这堆数据里有吗? 一定有,但是编码后 的,需要解码 Android & Pervasive Computing - 18 -

PCM与WAVE文件 n Pulse-code modulation(PCM,脉冲编码调制) 红色的点就是采样点,也就是 数据点 纵坐标电压,横坐标时间 9 11 12 13 14 15 15

PCM与WAVE文件 n Pulse-code modulation(PCM,脉冲编码调制) 红色的点就是采样点,也就是 数据点 纵坐标电压,横坐标时间 9 11 12 13 14 15 15 14. . . WAVE文件(*. wav)中存放的就 是这样的PCM数据 把myrec 1. amr变成wav RIFF WAVE Chunk Format Chunk Fact Chunk Data Chunk Android & Pervasive Computing 00 H 4 char "RIFF"标志 24 H 4 char 标记符"data" 28 H 4 long int 语音数据长度 - 19 -

从AMR数据中找到波形 n 实际上就是解码myrec 1. amr的数据帧 从31(30. 5)个字节中回复出 160*2 = 320个字节 AMR Core Frame包含Class A,

从AMR数据中找到波形 n 实际上就是解码myrec 1. amr的数据帧 从31(30. 5)个字节中回复出 160*2 = 320个字节 AMR Core Frame包含Class A, B, C三个部分 Class A:一帧最敏感、重要的数据。损坏则整个帧无法解码; Class B:比Class A不重要;Class C:比Class B更不重要 Index AMR Core Frame Class A Class B Class C 7 81 103 60 244 08 55 6 D 94 4 C 71 A 0 81 E 7 EA D 2 04 24 44 80 00 0 E CD 82 B 8 11 18 00 00 97 C 4 79 4 E 77 40 实际上AMR解析并不容易,我们用一 下成型的converter 具吧! Android & Pervasive Computing - 21 -

求一帧数据的FFT和Hf n 对一帧数据求其FFT 随便取两帧看一看 第 180帧 第 360帧 n 求Hf 将FFT代入 Hf=- pilog(pi) 即可

求一帧数据的FFT和Hf n 对一帧数据求其FFT 随便取两帧看一看 第 180帧 第 360帧 n 求Hf 将FFT代入 Hf=- pilog(pi) 即可 Android & Pervasive Computing - 25 -

分类 — 根据特征对数据分类 Android & Pervasive Computing - 26 -

分类 — 根据特征对数据分类 Android & Pervasive Computing - 26 -

区分是voice, music还是ambient sound n 特征抽取 进行分割 Zero Crossing Rate (ZCR) 一个帧内的时域分析 i=0 n|sign(si) –

区分是voice, music还是ambient sound n 特征抽取 进行分割 Zero Crossing Rate (ZCR) 一个帧内的时域分析 i=0 n|sign(si) – sign(si-1)| ZCRf = 2 1 x>0 sign(x) = -1 x<0 各种音频信号对应的ZCR music 可求 variance (方差) Android & Pervasive Computing speech - 27 -

区分是voice, music还是ambient sound n 特征抽取 进行分割 Spectral Flux (SF) SFt = t是帧号,i是FFT求出 的frequency bin号

区分是voice, music还是ambient sound n 特征抽取 进行分割 Spectral Flux (SF) SFt = t是帧号,i是FFT求出 的frequency bin号 i=1 n(pt(i) – pt-1(i))2 pt(i)是归一化的第i个frequency bin对应的幅值 归一化是指除以 0 bin(DC, 直流)对 应的幅值(Volume) SF表征了shape of the spectrum的变化 speech music Android & Pervasive Computing Shape变化很快 Shape变化慢,但有 时会大幅变化 - 29 - SF较大 SF小,有 时很大

区分是voice, music还是ambient sound n 特征抽取 进行分割 Spectral Rolloff (SRF) 阈值如93% SRFf = max(h| i=1

区分是voice, music还是ambient sound n 特征抽取 进行分割 Spectral Rolloff (SRF) 阈值如93% SRFf = max(h| i=1 hp(i) < 阈值) SRF越大 高频分量越多 Spectral Centroid (SC) i=1 n i p(i)2 SCf = n p(i)2 i=1 高频分量越多 SC越大 music spectral power 分布的中心点 music 当然可以再定义很多特征 可以出很多研究成果 做信号处理(如图像处理)的人很多… Android & Pervasive Computing - 30 -

应用这些手段处理一下myrec 1. wav ZCR 水准很差 Low Energy Frame Rate 窗口大小为 30 窗口大小为 10 Android

应用这些手段处理一下myrec 1. wav ZCR 水准很差 Low Energy Frame Rate 窗口大小为 30 窗口大小为 10 Android & Pervasive Computing - 31 -

推演 — 得到更精细的facts Android & Pervasive Computing - 33 -

推演 — 得到更精细的facts Android & Pervasive Computing - 33 -

在category分类基础上再挖掘 n 对voice和speech进行进一步细分 speech recognition(语音识别) L. Rabiner and B. Juang. Fundamentals of speech recognition.

在category分类基础上再挖掘 n 对voice和speech进行进一步细分 speech recognition(语音识别) L. Rabiner and B. Juang. Fundamentals of speech recognition. 1993. speaker identification(身份鉴别) D. Reynolds. An Overview of Automatic Speaker Recognition Technology. In IEEE ICASSP 1999. music genre classification(音乐风格识别) G. Tzanetakis and P. Cook. Musical genre classification of audio signals. IEEE TSAP 2002. n 对背景声音进行Unsupervised Learning 对于每个人,发现那些影响其生活的environmental sounds Android & Pervasive Computing - 34 -

准备Unsupervised Learning n 核心思想是找B个聚类中心 bin 2 看window i的MFCC wi更 靠近哪一个bin的中心 MFCC本身针对frame定义 的,为高效在一个窗口上 平均就是wi 1

准备Unsupervised Learning n 核心思想是找B个聚类中心 bin 2 看window i的MFCC wi更 靠近哪一个bin的中心 MFCC本身针对frame定义 的,为高效在一个窗口上 平均就是wi 1 Prob(pi=j) = bin 1 j=argmaxb. N(w, b) 且 N(w, j)>阈值 0 否则 N(w, b) pi称为wi的label Android & Pervasive Computing - 36 -

进行Unsupervised Learning n 如何在线的(online)调整这B个聚类中心? 增量调整(incrementally updated) i=1 t Prob(pi=b)wi b = i=1 t Prob(pi=b)

进行Unsupervised Learning n 如何在线的(online)调整这B个聚类中心? 增量调整(incrementally updated) i=1 t Prob(pi=b)wi b = i=1 t Prob(pi=b) 说明只能处理B 个event 由前面的定义, 就是均值 i=1 t Prob(pi=b))(wi - b )T b = i=1 t Prob(pi=b) 根据新的均值调 整方差 Android & Pervasive Computing - 37 -

应用 — 解决问题,实现想法 Android & Pervasive Computing - 39 -

应用 — 解决问题,实现想法 Android & Pervasive Computing - 39 -

Music Detector n 给用提供一种方式来发现和music有关的事件(如 parties, concerts) 当用户检测到music出现时就take a picture 这些picture马上被贴到网站上(同时要携带位置信息) Android & Pervasive Computing

Music Detector n 给用提供一种方式来发现和music有关的事件(如 parties, concerts) 当用户检测到music出现时就take a picture 这些picture马上被贴到网站上(同时要携带位置信息) Android & Pervasive Computing - 41 -

JNI:Java Native Interface n JAVA本地调用,就是Java调用本地的程序 步骤 1: 编写Java程序 class Hello. World { public native

JNI:Java Native Interface n JAVA本地调用,就是Java调用本地的程序 步骤 1: 编写Java程序 class Hello. World { public native void display. Hello. World(); static { System. load. Library("hello"); } public static void main(String[] args) { new Hello. World(). display. Hello. World(); } } 步骤 2: 编译Java程序 javac Hello. World. java Android & Pervasive Computing - 43 -

JNI:Java Native Interface 步骤 3: 生成扩展名为h的头文件 javah -classpath. -jni Hello. World JNIEXPORT void JNICALL

JNI:Java Native Interface 步骤 3: 生成扩展名为h的头文件 javah -classpath. -jni Hello. World JNIEXPORT void JNICALL Java_Hello. World_display. Hello. World(JNIEnv*, jobject) ; 步骤 4: 编写本地方法实现(Hello. World. Impl. c) #include "jni. h" #include "Hello. World. h" JNIEXPORT void JNICALL Java_Hello. World_display. Hello. World(JNIEnv *env, jobject obj) { printf("Hello world!n"); return; } Android & Pervasive Computing - 44 -

JNI:Java Native Interface 步骤 5: 生成动态链接库DLL cl -I%java_home%includewin 32 -LD Hello. World. Imp. c

JNI:Java Native Interface 步骤 5: 生成动态链接库DLL cl -I%java_home%includewin 32 -LD Hello. World. Imp. c Fehello. dll 步骤 6: 运行程序 java Hello. World Android & Pervasive Computing - 45 -