Sejauh yang saya tahu, Mathematica tidak pernah benar-benar mendukung suara di Linux.
Perintah Play
itu diperkenalkan di versi 3, dan seluruh sistem suara dirombak di versi 6. Jika Anda mencari comp.soft-sys.math.mathematica, Anda akan menemukan pertanyaan kembali ke versi 3. Dalam versi 6, perintah EmitSound
diperkenalkan. Ini sekarang mendasari sebagian besar generasi suara Mathematica, tapi saya tidak bisa menemukan cara cepat untuk memperbaiki / meretasnya untuk linux, karena EmitSound
melakukan beberapa preprocessing (mencari tahu jenis objek apa yang telah diberikan) sebelum meneruskan suara ke frontend untuk evaluasi.
Driver suara / API default yang digunakan di sebagian besar pemasangan linux adalah ALSA ( wiki ). Itu menjadi default pada tahun 2002 di kernel linux 2.6 dan OSS ditandai sebagai "disusutkan" (meskipun OSS masih dalam pengembangan aktif). Banyak distribusi Linux sekarang menggunakan PulseAudio
yang berada di atas suara ALSA yang mendasarinya. (Siapa pun dengan pemahaman yang lebih baik tentang suara Linux harus merasa bebas untuk mengedit ini!)
Mathematica memperkenalkan suara dalam versi 3 (1996) dan dengan demikian menggunakan OSS untuk varian * nix-nya. Ini masih terjadi, meskipun OSS tidak lagi menjadi default di hampir semua varian Linux. Mengetahui hal ini memberi kami solusi yang memungkinkan: gunakan lapisan emulasi OSS (lihat, misalnya, http://wiki.debian.org/SoundFAQ ).
Yang paling sederhana adalah dengan menggunakan emulasi mode userspace dan menjalankan Mathematica aoss
aoss mathematica
atau setara PulseAudio
padsp mathematica
Masalah dengan keduanya adalah bahwa ini hanya bekerja dengan suara MIDI, bukan dengan suara sampel. Setidaknya ini benar pada sistem Ubuntu 10.10 saya dan sistem linux Scott Kruger (dari tim Dukungan Teknis WRI ). Laporan bug telah diajukan tentang masalah ini.
Atau, Anda dapat memuat kompatibilitas OSS ke dalam kernel Anda
apt-get install alsa-oss
modprobe snd_pcm_oss
modprobe snd_mixer_oss
dan Anda dapat menambahkan snd_pcm_oss
dan snd_mixer_oss
untuk /etc/modules
memuat mereka pada saat boot. Modul-modul ini tidak tersedia di Ubuntu 10.10
karena mereka memutuskan untuk menghapus kompatibilitas mundur. Saya tidak dapat menguji hal di atas tanpa kompilasi ulang kernel saya ...
Karena emulasi OSS di atas saat ini tidak bekerja dengan sempurna, inilah beberapa cepat kerja-arounds berdasarkan beberapa diskusi yang pernah kulihat (misalnya, a b c ) dan ditulis ulang untuk menggunakan standar perintah ALSA.
Untuk sampel suara, gunakan 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 <> ")&"];]
misalnya ALSASound[Play[Sin[1000 t^2], {t, 0, 1}], "WAV"]
,.
Anda juga harus bisa Export
langsung ke /dev/snd/
perangkat yang sesuai ... tapi saya tidak bisa berfungsi.
Untuk midi
penggunaan aplaymidi
. Agar ini berfungsi, Anda memerlukan semacam perangkat lunak / perangkat keras midi synth yang diinstal. Saya telah timidity
menjalankan pada port 128. (Lihat di sini untuk bantuan)
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 <> ")&"];]
misalnya, ALSASound[Sound[SoundNote /@ CharacterRange["A", "G"]], "MIDI"]
Anda sekarang dapat membungkus ALSASound
perintah yang sesuai di sekitar objek suara. Anda juga dapat mendefinisikan ulang Play
untuk menggunakan ALSASound
:
SetOptions[Play, DisplayFunction -> ((ALSASound[#, "WAV"]; #) &)];
Ini pada dasarnya setara dengan pengaturan $ SoundDisplayFunction , seperti yang direkomendasikan oleh banyak diskusi di internet. Pengaturan opsi ini akan memutar suara, lalu mengeluarkan grafik normal.
Play[Sin[1000 t^2], {t, 0, 1}]
tetapi tombol start / stop tidak akan berfungsi, karena didasarkan pada EmitSound
.
Untuk membuat Beep[]
padanan sederhana , coba
ALSABeep[] := Play[Sin[5000 t], {t, 0, .1},
DisplayFunction -> (ALSASound[#, "WAV"]&)]
Terakhir, jika Anda menginstal text-to-speech festival (atau program text-to-speech lainnya ), maka Anda dapat mengganti Speak
fungsi Mathematica , misalnya,
FestivalSpeak[str_String] := (Run["(echo \"" <> str <> "\" | esddsp festival --tts)&"];)
FestivalSpeak[expr_] := FestivalSpeak[SpokenString[expr]]