Linux 下的 Mathematica 没有声音

Linux 下的 Mathematica 没有声音

我在 Mathematica 中有大量事件需要响应,但总是检查这些事件并不实际,尤其是因为事件随时间随机分布。
所以我想添加一个简单的声音来提醒我去检查事件。我想用它Beep[],但没有得到结果,事实上,直到现在我才意识到 Mathematica 根本没有发出任何声音。

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

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

答案1

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

大多数 Linux 安装中使用的默认声音驱动程序/API 是阿尔萨斯大学维基百科)。它在 2002 年成为 Linux 内核 2.6 中的默认设置,并且开源软件被标记为“弃用”(尽管 OSS 仍在积极开发中)。许多 Linux 发行版现在使用脉冲音频 它位于底层 ALSA 声音之上。(任何对 Linux 声音有更好理解的人都可以随意编辑此内容!)

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

最简单的方法是使用用户空间模式模拟并运行 Mathematicaaoss

aoss mathematica

或 PulseAudio 等效版本

padsp mathematica

这两个的问题是它只适用于 MIDI 声音,而不适用于采样声音。至少在我的 Ubuntu 10.10 系统和 Scott Kruger 的 Linux 系统上是这样的(WRI 技术支持团队)。 已针对此问题提交了错误报告。

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

apt-get install alsa-oss
modprobe snd_pcm_oss
modprobe snd_mixer_oss

您可以在启动时添加snd_pcm_osssnd_mixer_oss加载/etc/modules 它们。这些模块在 Ubuntu 10.10 中不可用 因为他们决定删除向后兼容性。如果不重新编译内核,我就无法测试上述内容……


由于上述 OSS 仿真目前无法完美运行,因此根据我看到的一些讨论,这里有几个快速解决方法(例如,A b C) 并重写以使用默认的 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,正如互联网上许多讨论所推荐的那样。此选项设置将播放声音,然后输出正常图形。

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

玩

但开始/停止按钮不起作用,因为它们基于EmitSound

制作一个简单的Beep[]等效,尝试

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

最后,如果你安装了节日文本转语音(或任何其他文字转语音程序),那么你可以替换 MathematicaSpeak功能,例如,

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

相关内容