iOS将音频从URL分为帧 [英] iOS Divide audio from URL into frames

查看:140
本文介绍了iOS将音频从URL分为帧的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用iOS中的一个简单的互联网广播应用程序,该应用程序具有非常简单的语音/音乐识别功能.主要思想是无线电,它播放来自url的信号,并同时检查正在广播的信号类型.当它检测到语音时,将更改频道,依此类推.

I am working on a simple internet radio app in iOS with a very simple speech/music discrimination. The main idea is a radio which plays a signal from url and at the same time it checks what type of signal is being broadcast. When it detects a speech it change the channel and so on.

我使用情节提要和Player的AVFoundation编写了一个简单的iOS应用.我在执行语音检测时遇到问题.我为算法编写了Matlab代码,但不确定如何在Xcode中执行.

I wrote a simple iOS app using storyboards and AVFoundation for Player. I have a problem with implementation of a speech detection. I wrote a Matlab code for an algorithm, but I'm not sure how to do it in Xcode.

clear all
close all
[s, fs] = audioread('nagranie.wav');
length = length(s)/fs;
lengthofframe20ms = 0.2*fs;
numberofframes20ms = round(length(s)/lengthofframe20ms);
s1 = zeros(lengthofframe20ms*numberofframes20ms,1);
for i=1:1:length(s(:,1))
s1(i,1)=s(i,1);
end
frame20ms=zeros(numberofframes20ms,lengthofframe20ms);
for i=1:1:numberofframes20ms
for j=1:1:lengthofframe20ms
frame20ms(i,j)=s1(j+3200*(i-1),1);
end
end
lengthofframe260ms = 2.6*fs;
numberofframes260ms = round(length(s)/lengthofframe260ms);
s2 = zeros(lengthofframe260ms*numberofframes260ms,1);
for i=1:1:length(s(:,1))
s2(i,1)=s(i,1);
end
frame260ms=zeros(numberofframes260ms,lengthofframe260ms);
for i=1:1:numberofframes260ms
for j=1:1:lengthofframe20ms
frame260ms(i,j)=s1(j+41600*(i-1),1);
end
end
En = zeros(numberofframes20ms,1);
for i=1:1:numberofframes20ms
L=length(frame20ms(i,:));
En(i)=(norm(frame20ms(i,:))^2)/L;
end
Ek = zeros(numberofframes260ms,1);
for i=1:1:numberofframes260ms
L=length(frame260ms(i,:));
Ek(i)=(norm(frame260ms(i,:))^2)/L;
end
sumN = 0;
for i=1:1:length(En)
sumN=sumN+En(i);
end
sumK = 0;
for i=1:1:length(Ek)
sumK=sumK+Ek(i);
end
EnP = zeros(numberofframes20ms,1);
for i=1:1:numberofframes20ms
EnP(i)=((En(i))/sumK);
end
treshold = 0.5;
lambda=treshold*sumN;

M=numberofframes20ms/numberofframes260ms;
coff=zeros(numberofframes20ms,1);
for i=1:1:numberofframes20ms
if (En(i)<lambda)
for k=1:1:numberofframes260ms
if (((k-1)*M+1)<i) && (i<k*M)
coff(i)=1;
end
end
end
end

如您所见,首先我们必须将信号分为20ms帧和更大的260ms帧,然后我们计算每20ms帧的能量,再做一些数学运算,最后检查条件,当它符合语音要求,如果不适合,则按音乐排序.

As you can see first of all we have to divide signal into 20ms frame and bigger 260 ms frames, then we calculate energy of a every 20ms frame, do some more math and at the last point we check the conditions, when it fits it's speech and when it doesn't frame is sorted as music.

我不知道该如何开始区分部分.我应该使用哪些框架?我认为这并不是很难,因为用MatLab编写它花了我20分钟的时间. :)

I don't know how to start doing the discrimination part. Which frameworks should I use? I think it can't be really hard, becouse it took me like 20 minutes to write it in MatLab. :)

这是我的应用播放广播电台的方式:

This is how my app play radio stations:

{
RadioInfo *sharedRadio = [RadioInfo sharedRadio];
NSString *program = [NSString stringWithFormat:@"%@",sharedRadio.list[value]];
NSURL *url = [NSURL URLWithString:program];
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:url];
self.playerItem = [AVPlayerItem playerItemWithURL:url];
self.player = [AVPlayer playerWithPlayerItem:playerItem];
self.player = [AVPlayer playerWithURL:url];
[self.player pause];
[self.player play];

}

这是我在这里的第一篇文章,请保持友好.我将不胜感激和帮助.我被困在这部分上.

This is my first post here so please be kind. I will appreciate and help. I'm stuck on this part.

推荐答案

如果要获取音频数据并进行播放,可以使用低于AvPlayer的API. AVPlayer太高级了,它不能让您访问音频数据.分析后,您可以通过HTTP检索音频并使用AvAudioPLayer框架进行播放.但是,当然,您必须自己实现许多事情.

If you want to get audio data and play it you can use lower level API than AvPlayer. AVPlayer is too high-level it doesn't give you access to audio data. You can retrieve your audio over HTTP and play it with AvAudioPLayer framework after analysis. But of course you have to implement many things yourself.

  NSURL *url = [NSURL URLWithString:@"http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"];
  NSData *soundData = [NSData dataWithContentsOfURL:url];

  // analyze sound data here and switch URL if needed

  audioPlayer = [[AVAudioPlayer alloc] initWithData:soundData  error:NULL];
  audioPlayer.delegate = self;
  [audioPlayer play];

这篇关于iOS将音频从URL分为帧的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆