我正在 iOS 中开发一个简单的互联网广播应用程序,具有非常简单的语音/音乐识别功能。主要思想是一个 radio ,它播放来自 url 的信号,同时它检查正在广播的信号类型。当它检测到语音时,它会改变 channel 等。
我使用 Storyboard和 AVFoundation for Player 编写了一个简单的 iOS 应用程序。我在实现语音检测时遇到问题。我为算法编写了 Matlab 代码,但不确定如何在 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
正如您所看到的,首先我们必须将信号分成 20 毫秒帧和更大的 260 毫秒帧,然后我们计算每 20 毫秒帧的能量,再做一些数学运算,最后一点我们检查条件,当它适合它的语音,当它不适合它时,它会被分类为音乐。
我不知道如何开始做歧视部分。我应该使用哪些框架?我认为这不会很难,因为我用 MatLab 写了大约 20 分钟。 :)
这是我的应用程序播放广播电台的方式:
{
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];
这是我在这里的第一篇文章,所以请善待。我会感激和帮助。我被困在这部分了。
最佳答案
如果您想获取音频数据并播放它,您可以使用比 AvPlayer 更低级别的 API。 AVPlayer 太高级了,它不允许您访问音频数据。您可以通过 HTTP 检索音频并在分析后使用 AvAudioPLayer 框架播放它。但是当然,您必须自己实现很多事情。
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 的音频分成帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26761417/
从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些
我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
如何使此根路径转到:“/dashboard”而不仅仅是http://example.com?root:to=>'dashboard#index',:constraints=>lambda{|req|!req.session[:user_id].blank?} 最佳答案 您可以通过以下方式实现:root:to=>redirect('/dashboard')match'/dashboard',:to=>"dashboard#index",:constraints=>lambda{|req|!req.session[:user_id].b
我正在使用Dragonfly在Rails3.1应用程序上处理图像。我正在努力通过url将图像分配给模型。我有一个很好的表格:{:multipart=>true}do|f|%>RemovePicture?Dragonfly的文档指出:Dragonfly提供了一个直接从url分配的访问器:@album.cover_image_url='http://some.url/file.jpg'但是当我在控制台中尝试时:=>#ruby-1.9.2-p290>picture.image_url="http://i.imgur.com/QQiMz.jpg"=>"http://i.imgur.com/QQ