Tidak ada suara di Mathematica di Linux

10

Saya memiliki serangkaian peristiwa besar dalam Mathematica yang perlu saya bereaksi, dan tidak praktis selalu memeriksanya, terutama karena peristiwa didistribusikan secara acak dalam waktu.
Jadi saya ingin menambahkan suara sederhana untuk mengingatkan saya untuk pergi memeriksa acara tersebut. Saya ingin menggunakan Beep[]tetapi saya tidak mendapatkan hasil, pada kenyataannya, saya tidak menyadari sampai sekarang bahwa Mathematica tidak membuat suara apa pun.

Saya menggunakan Debian Squeeze Stable dan tidak memiliki masalah dengan aplikasi lain yang menggunakan suara.

Ini mempengaruhi semua versi terbaru (7, 8 dan 9) dari Mathematica dan mungkin versi yang lebih lama tergantung pada pengaturan suara sistem Anda.

Enedene
sumber
Ini telah menjadi masalah di Mma sejak mereka menambahkan perintah suara di versi 6. Saya ingat memperbaikinya pada saat itu, tetapi belum merasa terganggu dalam versi yang lebih baru. Coba dokumentasinya di sini .
Simon
Haruskah pertanyaan ini dimigrasikan ke superuser?
Simon
Sayangnya saya masih tidak dapat suara.
Saya poster asli di Stackoverflow. Terima kasih telah memberi tahu saya tentang situs ini, saya tidak tahu yang ini ada. Luar biasa saya bisa memanfaatkannya dengan baik.
enedene

Jawaban:

10

Sejauh yang saya tahu, Mathematica tidak pernah benar-benar mendukung suara di Linux. Perintah Playitu 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 EmitSounddiperkenalkan. Ini sekarang mendasari sebagian besar generasi suara Mathematica, tapi saya tidak bisa menemukan cara cepat untuk memperbaiki / meretasnya untuk linux, karena EmitSoundmelakukan 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_ossdan snd_mixer_ossuntuk /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 Exportlangsung ke /dev/snd/perangkat yang sesuai ... tapi saya tidak bisa berfungsi.

Untuk midipenggunaan aplaymidi. Agar ini berfungsi, Anda memerlukan semacam perangkat lunak / perangkat keras midi synth yang diinstal. Saya telah timiditymenjalankan 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 ALSASoundperintah yang sesuai di sekitar objek suara. Anda juga dapat mendefinisikan ulang Playuntuk 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}]

Bermain

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 Speakfungsi Mathematica , misalnya,

FestivalSpeak[str_String] := (Run["(echo \"" <> str <> "\" | esddsp festival --tts)&"];)
FestivalSpeak[expr_] := FestivalSpeak[SpokenString[expr]]
Simon
sumber
Simon, jawaban ini berhasil, terima kasih banyak.
Enedene
Btw, apakah ada yang tahu jika Mathematica berencana untuk mendukung suara di Linux di masa depan? Saya kira mereka adalah perangkat lunak khusus di mana persentase orang yang menggunakannya di Linux jauh lebih besar daripada kebanyakan perangkat lunak lain.
Enedene
@enedene: Saya menanyakan pertanyaan tentang dukungan WRI hari ini. Semoga kami akan mendapat jawaban dalam beberapa hari ke depan ...
Simon
Terima kasih Simon, kamu sudah membantu. Jika Anda mendapat jawaban, silakan kirim di sini atau berikan tautan.
enedene
@enedene: Saya mendapat balasan yang bermanfaat dari dukungan WRI. Lihat hasil edit!
Simon