Linux下Mathematica中没有声音


10

我在Mathematica中需要处理大量事件,并且总是检查它是不实际的,特别是因为事件是随时间随机分布的。
因此,我想添加一个简单的声音来提醒我去检查事件。我想使用它,Beep[]但没有任何结果,实际上,直到现在我才意识到Mathematica没有发出任何声音。

我使用Debian Squeeze Stable,对于使用声音的任何其他应用程序都没有问题。

这会影响Mathematica的所有最新版本(7、8和9),并且可能会影响较旧的版本,具体取决于系统的声音设置。


自从Mma 在版本6中添加声音命令以来,这在Mma中就一直是一个问题。我记得当时对其进行了修复,但并没有在最新版本中打扰。在这里尝试文档。
西蒙(Simon)

是否应该将此问题迁移到超级用户?
西蒙(Simon)

不幸的是我仍然听不到声音。

我是Stackoverflow上的原始海报。感谢您向我介绍这个网站,但我不知道这个网站的存在。我可以很好地利用它,这真是太棒了。
enedene 2011年

Answers:


10

据我所知,Mathematica从未真正支持Linux中的声音。 该命令Play是在版本3中引入的,整个声音系统在版本6中已进行了大修。如果搜索comp.soft-sys.math.mathematica,您会发现问题一直追溯到版本3。在版本6中,命令EmitSound被引入。现在,这是大多数Mathematica声音的基础,但是我找不到为Linux修复/破解它的快速方法,因为EmitSound在将声音传递到前端之前,需要进行一些预处理(弄清楚给出的对象类型)。评估。

大多数Linux安装中使用的默认声音驱动程序/ API是ALSAwiki)。它在2002年成为Linux内核2.6中的默认值,并且OSS被标记为“已贬值”(尽管OSS仍在积极开发中)。现在,许多Linux发行版都使用PulseAudio ,它位于基础ALSA声音的顶部。(任何对Linux声音有更好了解的人都应该随时对其进行编辑!)

Mathematica在版本3(1996)中引入了声音,因此将OSS用于* nix变体。尽管OSS不再是几乎所有Linux变体中的默认设置,但情况仍然如此。知道这一点将为我们提供一种可能的解决方案:使用OSS仿真层(请参阅例如http://wiki.debian.org/SoundFAQ)。

最简单的方法是使用用户空间模式仿真并通过以下方式运行Mathematica aoss

aoss mathematica

或等价的PulseAudio

padsp mathematica

两者的问题在于它仅适用于MIDI声音,不适用于采样声音。至少在我的Ubuntu 10.10系统和Scott Wruger(WRI技术支持团队的)Linux系统上确实如此。已针对此问题提交错误报告。

或者,您可以将OSS兼容性加载到内核中

apt-get install alsa-oss
modprobe snd_pcm_oss
modprobe snd_mixer_oss

您可以添加snd_pcm_oss,并snd_mixer_oss/etc/modules 它们在引导时加载。这些模块在Ubuntu 10.10中不易使用, 因为它们决定删除向后兼容性。如果不重新编译内核,我将无法测试以上内容。


由于上述OSS模拟目前不正常使用,这里是基于一些我见过的讨论(例如,一对夫妇快速变通的 b Ç),并重新写入使用默认ALSA命令。

对于采样声音,请使用aplay

ALSASound[snd_, "WAV"] := Module[{playCmd = "aplay", soundFileName},
  soundFileName = "/dev/shm/" <> ToString[Unique["MmaSound"]] <> ".wav";
  playCmd = playCmd <> " " <> soundFileName;
  Export[soundFileName, snd, "WAV"];
  Run["(" <> playCmd <> ";" <> "/bin/rm -f " <> soundFileName <> ")&"];]

例如ALSASound[Play[Sin[1000 t^2], {t, 0, 1}], "WAV"]
您还应该能够Export直接找到合适的/dev/snd/设备...但是我无法正常工作。

midi使用aplaymidi。为此,您需要安装某种软件/硬件Midi合成器。我已经timidity在端口128上运行。(请参见此处以获取帮助)

ALSASound[snd_, "MIDI"] := 
 Module[{playCmd = "aplaymidi", port = "128:0", soundFileName},
  soundFileName = "/dev/shm/" <> ToString[Unique["MmaSound"]] <> ".mid";
  playCmd = playCmd <> " -p " <> port <> " " <> soundFileName;
  Export[soundFileName, snd, "MIDI"];
  Run["(" <> playCmd <> ";" <> "/bin/rm -f " <> soundFileName <> ")&"];]

例如, ALSASound[Sound[SoundNote /@ CharacterRange["A", "G"]], "MIDI"]

现在,您可以ALSASound在任何声音对象周围包装适当的命令。您也可以重新定义Play使用ALSASound

SetOptions[Play, DisplayFunction -> ((ALSASound[#, "WAV"]; #) &)];

这实际上等效于设置$ SoundDisplayFunction,这是Internet上许多讨论所建议的。此选项设置将播放声音,然后输出普通图形。

Play[Sin[1000 t^2], {t, 0, 1}]

玩

但是开始/停止按钮基于,因此无法使用EmitSound

为了使之简单Beep[],请尝试

ALSABeep[] := Play[Sin[5000 t], {t, 0, .1}, 
                   DisplayFunction -> (ALSASound[#, "WAV"]&)]

最后,如果您安装了节日文本转语音(或其他任何文本转语音程序),则可以替换Mathematica Speak功能,例如,

FestivalSpeak[str_String] := (Run["(echo \"" <> str <> "\" | esddsp festival --tts)&"];)
FestivalSpeak[expr_] := FestivalSpeak[SpokenString[expr]]

西蒙,这个答案很成功,非常感谢。
enedene 2011年

顺便说一句,有人知道Mathematica将来是否计划在Linux上支持声音吗?我猜他们是特定的软件,在Linux上使用该软件的人比例比大多数其他软件要高得多。
enedene 2011年

@enedene:我今天问了WRI支持的问题。希望我们在未来几天能得到答案...
Simon Simon

谢谢西蒙,您的帮助很大。如果您得到答案,请在此处发布或提供链接。
enedene 2011年

@enedene:我收到了WRI支持的有用回复。看到编辑!
西蒙(Simon)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.