在Stanford的Andrew Ng在Coursera的机器学习入门讲座中的一篇幻灯片中,他给出了以下一行Octave解决方案,因为音频源由两个空间分离的麦克风录制:
[W,s,v]=svd((repmat(sum(x.*x,1),size(x,1),1).*x)*x');
Run Code Online (Sandbox Code Playgroud)
幻灯片的底部是"来源:Sam Roweis,Yair Weiss,Eero Simoncelli",而在之前幻灯片的底部则是"音频片段由Te-Won Lee提供".在视频中,吴教授说,
"所以你可能会看到这样无监督的学习,并问,'实现这个有多复杂?' 看起来为了构建这个应用程序,似乎要做这个音频处理,你会写大量的代码,或者可能链接到一堆处理音频的C++或Java库.看起来它真的是真的执行此音频的复杂程序:分离出音频等等.事实证明算法可以完成您刚刚听到的内容,只需一行代码即可完成...此处显示.确实需要研究人员很长时间想出这一行代码.所以我并不是说这是一个容易出问题的问题.但事实证明,当你使用正确的编程环境时,很多学习算法都会成为很短的程序."
在视频讲座中播放的分离音频结果并不完美,但在我看来,令人惊叹.有没有人知道这一行代码如何表现如此之好?特别是,有没有人知道有关这一行代码的Te-Won Lee,Sam Roweis,Yair Weiss和Eero Simoncelli的工作的参考资料?
UPDATE
为了演示算法对麦克风间隔距离的敏感度,以下模拟(在Octave中)将音调与两个空间分离的音调发生器分开.
% define model
f1 = 1100; % frequency of tone generator 1; unit: Hz
f2 = 2900; % frequency of tone generator 2; unit: Hz
Ts = 1/(40*max(f1,f2)); % sampling period; unit: s
dMic = 1; % distance between microphones centered about origin; unit: m
dSrc = 10; % distance between tone generators centered about origin; unit: m
c = 340.29; % speed …
Run Code Online (Sandbox Code Playgroud) 我正试图从我的Yahoo!下载一个大文件 网站服务器显然是设置(不是由我)断开下载,如果他们没有在100秒内完成.该文件足够小,通常可以成功传输.在数据速率较慢且下载断开的情况下,有没有办法在发生断开连接的文件偏移处恢复URLConnection?这是代码:
// Setup connection.
URL url = new URL(strUrl[0]);
URLConnection cx = url.openConnection();
cx.connect();
// Setup streams and buffers.
int lengthFile = cx.getContentLength();
InputStream input = new BufferedInputStream(url.openStream());
OutputStream output = new FileOutputStream(strUrl[1]);
byte data[] = new byte[1024];
// Download file.
for (total=0; (count=input.read(data, 0, 1024)) != -1; total+=count) {
publishProgress((int)(total*100/lengthFile));
output.write(data, 0, count);
Log.d("AsyncDownloadFile", "bytes: " + total);
}
// Close streams.
output.flush();
output.close();
input.close();
Run Code Online (Sandbox Code Playgroud) 这是我之前的问题的延续,当我不是注册用户时,我发布了这个问题.作为复习,我正在尝试从我的Yahoo!继续下载大文件.下载中断时的网站服务器.我以前认为中断是由于100秒超时限制(因为Yahoo!对用户编写的脚本强制执行该时间限制).但是,当我测量下载中断的时间时,我发现中断时序变化很大(有时下载不间断运行不到100秒,有时甚至长达7分钟).所以我不知道超时的原因,我只是想解决它们.
我尝试了naikus的建议(谢谢),根据http标头字段的转储,看来我的Yahoo! 网站服务器确实识别"范围"属性,该属性应允许下载在中断的偏移处恢复.遗憾的是,虽然恢复连接中的http标头中的字节范围显示正确,但传输的内容始终在文件的开头重新开始.(我的测试文件是一个由50,000个4字节整数组成的数组,从0开始递增.我的下载文件总是在每次发生下载中断的偏移处开始重新计数.)
雅虎还有一些其他的HTTP连接属性请求我应该去做!服务器实际上跳到标头字节范围中指定的文件偏移量? 这是代码及其转储的内容:
// Setup connection.
URL url = new URL(strUrl[0]);
URLConnection connection = url.openConnection();
downloaded = Integer.parseInt(strUrl[3]);
if (downloaded > 0) {
connection.setRequestProperty("Range", "bytes="+downloaded+"-");
connection.connect();
fileLength = mDownloadFileLength;
Log.d("AsyncDownloadFile",
"new download seek: " + downloaded +
"; lengthFile: " + fileLength);
}
else {
connection.connect();
downloaded = 0;
fileLength = connection.getContentLength();
mDownloadFileLength = fileLength;
}
Map<String, List<String>> map = connection.getHeaderFields();
Log.d("AsyncDownloadFile", "header fields: " + map.toString());
// Setup streams and buffers. …
Run Code Online (Sandbox Code Playgroud) 总的来说,我对Android的默认文本到语音引擎(即com.svox.pico)印象非常深刻.正如预期的那样,它会错误地发音一些词(就像我一样),因此偶尔需要一些发音指导.所以我想知道最好的做法是用语音拼写出pico TTS引擎错误发音的那些词.
例如,查查拉卡鸟的正确发音是CHAH-chah-LAH-kah.这是TTS引擎产生的:
mTts.speak("Chachalaca", TextToSpeech.QUEUE_ADD, null); // output: chuh-KAL-uh-KUH
mTts.speak("CHAH-chah-LAH-kah", TextToSpeech.QUEUE_ADD, null); // output: CHAH-chah-EL-AY-AYCH-dash-kuh
mTts.speak("CHAHchahLAHkah", TextToSpeech.QUEUE_ADD, null); // output: CHA-chah-LAH-ka
mTts.speak("CHAH chah LOCKah", TextToSpeech.QUEUE_ADD, null); // output: CHAH-chah-LAH-kah
Run Code Online (Sandbox Code Playgroud)
这是我的问题.
顺便说一句,这是TTS引擎写入logcat的内容:
V/TtsService(294):TTS处理:姜查姜查洛克
V/TtsService(294):TtsService.setLanguage(ENG,USA)
I/SVOX微微引擎(294):语言已经被加载(EN-US == EN-US )
I/SynthProxy(294):将语速设置为100
I/SynthProxy(294):将音高设置为100
[UPDATE]
我尝试将XML文档传递给TextToSpeech.Speak(),如下所示:
String text = "<?xml version=\"1.0\"?>" +
"<speak version=\"1.0\" xmlns=\"http://www.w3.org/2001/10/synthesis\" " +
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
"xsi:schemaLocation=\"http://www.w3.org/2001/10/synthesis " +
"http://www.w3.org/TR/speech-synthesis/synthesis.xsd\" " +
"xml:lang=\"en-US\">" +
"That is a big car! " +
"That <emphasis>is</emphasis> a big car! …
Run Code Online (Sandbox Code Playgroud) 将以下SSML(语音合成标记语言)文档传递给com.svox.pico TextToSpeech引擎会导致读取XML主体,但无法通过音素元素或强调元素进行控制.这个结果(没有明显的SSML控制)在运行Android 2.2的Nexus One以及运行SDK级别为8的AVD的模拟器上是相同的.
String text = "<?xml version=\"1.0\"?>" +
"<speak version=\"1.0\" xmlns=\"http://www.w3.org/2001/10/synthesis\" " +
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
"xsi:schemaLocation=\"http://www.w3.org/2001/10/synthesis " +
"http://www.w3.org/TR/speech-synthesis/synthesis.xsd\" " +
"xml:lang=\"en-US\">" +
"tomato " +
"<phoneme alphabet=\"ipa\" ph=\"t&#x259;mei&#x325;&#x27E;ou&#x325;\"> tomato </phoneme> " +
"That is a big car! " +
"That <emphasis> is </emphasis> a big car! " +
"That is a <emphasis> big </emphasis> car! " +
"That is a huge bank account! " +
"That <emphasis level=\"strong\"> is </emphasis> a huge bank account! …
Run Code Online (Sandbox Code Playgroud) 给定已知的周期性运动(例如,行走),我想在运动中的相同点处拍摄全分辨率快照(即,在不同时段内的相同时间偏移).不过在Nexus S的(当前运行OS 4.1.1,但相同的是以前的OS版本的真),我看到的快门时滞,我不能准确地规划快照的时间这么多的变化.这是50张照片的快门滞后的直方图.(我在快门回调开始之前用Camera.takePicture()和另一个System.nanoTime()测量了一个System.nanoTime()的快门延迟.相机镜头一直被覆盖以消除由于光线引起的任何变化.)
我可以在应用程序中做些什么来减少这种快门滞后变化吗?(在这个应用中,平均滞后可以是任何持续时间,但标准偏差必须小...比上面直方图中显示的快门滞后的0.5秒标准偏差小得多.)我希望有人有一个聪明的建议.如果我没有得到任何建议,我会在Android错误跟踪器中发布功能请求.
更新:我在https://groups.google.com/forum/?hl=en&fromgroups#!topic/android-developers/WaHhTicKRA0的建议之后关闭了自动对焦(通过将焦点设置为无限远) 它有所帮助,如图所示以下直方图.任何减少快门滞后变化的想法甚至更多?
更新2:我禁用了剩余的自动参数:白平衡,场景模式,闪光.下面的快门滞后时间变化直方图似乎与运行OS 4.1.1的Nexus S一样好.这将是不错的要少得多的变异性快门延迟时间,也许通过指定Camera.takePicture)可选的最低快门延迟时间(这将延迟快门,如果它是指定的最小前准备好.我已向Android问题跟踪器发布了功能请求.如果您也有兴趣获取该功能,请在http://code.google.com/p/android/issues/detail?id=35785 " 加注星标"
当Eclipse在构建Quickstart:在Android示例应用程序上运行Drive App时包含proguard时,应用程序将失去上传文件的能力.
如果在没有proguard的情况下构建应用程序的发布版本,则可以正确配置Google API客户端ID.但是,在启用proguard的Eclipse中构建时,同一发行版本应用程序的文件上载不起作用.这是我有问题的proguard配置文件:
# To enable ProGuard in your project, edit project.properties
# to define the proguard.config property as described in that file.
#
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in ${sdk.dir}/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the ProGuard
# include property in project.properties.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
-libraryjars /libs/android-support-v4.jar …
Run Code Online (Sandbox Code Playgroud)