Linux 下 Mathematica 没有声音

ene*_*ene 10 audio linux mathematica

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

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

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

Sim*_*mon 10

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

大多数 linux 安装中使用的默认声音驱动程序/API 是ALSA ( wiki )。它在 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
Run Code Online (Sandbox Code Playgroud)

或 PulseAudio 等价物

padsp mathematica
Run Code Online (Sandbox Code Playgroud)

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

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

apt-get install alsa-oss
modprobe snd_pcm_oss
modprobe snd_mixer_oss
Run Code Online (Sandbox Code Playgroud)

您可以添加snd_pcm_oss,并snd_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 <> ")&"];]
Run Code Online (Sandbox Code Playgroud)

例如,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 <> ")&"];]
Run Code Online (Sandbox Code Playgroud)

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

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

SetOptions[Play, DisplayFunction -> ((ALSASound[#, "WAV"]; #) &)];
Run Code Online (Sandbox Code Playgroud)

这本质上等同于设置$SoundDisplayFunction,正如互联网上的许多讨论所推荐的那样。此选项设置将播放声音,然后输出正常图形。

Play[Sin[1000 t^2], {t, 0, 1}]
Run Code Online (Sandbox Code Playgroud)

玩

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

要制作一个简单的Beep[]等价物,请尝试

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

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

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