Không có âm thanh trong Mathicala trong Linux


10

Tôi có một tập hợp lớn các sự kiện trong Mathematica mà tôi cần phải phản ứng và không thực tế khi luôn kiểm tra nó, đặc biệt là khi các sự kiện được phân phối ngẫu nhiên theo thời gian.
Vì vậy, tôi muốn thêm một âm thanh đơn giản để nhắc tôi đi kiểm tra sự kiện. Tôi muốn sử dụng Beep[]nhưng tôi không nhận được kết quả, thực tế, tôi đã không nhận ra rằng Mathicala không tạo ra âm thanh gì.

Tôi sử dụng Debian Squeeze Stable và không gặp rắc rối với bất kỳ ứng dụng nào khác sử dụng âm thanh.

Điều này ảnh hưởng đến tất cả các phiên bản gần đây (7, 8 và 9) của Mathicala và có thể là các phiên bản cũ hơn tùy thuộc vào thiết lập âm thanh của hệ thống của bạn.


Đây là một vấn đề ở Mma kể từ khi họ thêm các lệnh âm thanh trong phiên bản 6. Tôi nhớ đã sửa nó vào thời điểm đó, nhưng không bị làm phiền trong các phiên bản gần đây. Hãy thử tài liệu ở đây .
Simon

Câu hỏi này có nên được chuyển sang superuser không?
Simon

Thật không may, tôi vẫn không nhận được âm thanh.

Tôi là người đăng tải ban đầu trên Stackoverflow. Cảm ơn bạn đã cho tôi biết về trang web này, tôi không biết cái này tồn tại. Thật tuyệt vời tôi có thể sử dụng nó tốt.
enedene

Câu trả lời:


10

Theo như tôi biết, Mathematica chưa bao giờ thực sự hỗ trợ âm thanh trong Linux. Lệnh Playđược giới thiệu trong phiên bản 3 và toàn bộ hệ thống âm thanh được đại tu ở phiên bản 6. Nếu bạn tìm kiếm comp.soft-sys.math.mathIALa, bạn sẽ thấy các câu hỏi quay trở lại phiên bản 3. Trong phiên bản 6, lệnh EmitSoundđã được giới thiệu. Điều này bây giờ làm nền tảng cho hầu hết việc tạo ra âm thanh Mathicala, nhưng tôi không thể tìm ra cách nhanh chóng để sửa / hack nó cho linux, vì đã EmitSoundthực hiện một số tiền xử lý (tìm ra loại đối tượng nào được đưa ra) trước khi truyền âm thanh đến frontend đánh giá.

Trình điều khiển âm thanh / API mặc định được sử dụng trong hầu hết các bản cài đặt linux là ALSA ( wiki ). Nó trở thành mặc định vào năm 2002 trong kernel linux 2.6 và OSS được đánh dấu là "không dùng nữa" (mặc dù OSS vẫn đang được phát triển tích cực). Nhiều bản phân phối Linux hiện sử dụng PulseAudio nằm trên âm thanh ALSA bên dưới. (Bất cứ ai có hiểu biết tốt hơn về âm thanh Linux nên thoải mái chỉnh sửa phần này!)

Mathematica đã giới thiệu âm thanh trong phiên bản 3 (1996) và do đó đã sử dụng OSS cho các biến thể * nix của nó. Đây vẫn là trường hợp, mặc dù OSS không còn là mặc định trong hầu hết các biến thể Linux. Biết điều này mang lại cho chúng tôi một giải pháp khả thi: sử dụng lớp mô phỏng OSS (xem, ví dụ: http://wiki.debian.org/SoundFAQ ).

Đơn giản nhất là sử dụng mô phỏng chế độ không gian người dùng và chạy Mathicala thông qua aoss

aoss mathematica

hoặc tương đương PulseAudio

padsp mathematica

Vấn đề với cả hai điều này là nó chỉ hoạt động với âm thanh MIDI, không phải với âm thanh được lấy mẫu. Ít nhất điều này đúng với hệ thống Ubuntu 10.10 của tôi và hệ thống linux của Scott Kruger (thuộc nhóm Hỗ trợ Kỹ thuật WRI ). Một báo cáo lỗi đã được nộp về vấn đề này.

Ngoài ra, bạn có thể tải khả năng tương thích OSS vào kernel của mình

apt-get install alsa-oss
modprobe snd_pcm_oss
modprobe snd_mixer_oss

và bạn có thể thêm snd_pcm_osssnd_mixer_ossđể /etc/modules tải chúng tại boottime. Các mô-đun này không có sẵn trong Ubuntu 10.10 vì chúng đã quyết định loại bỏ tính tương thích ngược. Tôi không thể kiểm tra ở trên mà không biên dịch lại kernel của mình ...


Kể từ khi trên OSS thi đua hiện không làm việc một cách hoàn hảo, đây là một vài cách nhanh chóng công việc ở quanh dựa trên một số các cuộc thảo luận tôi đã nhìn thấy (ví dụ, một b c ) và viết lại để các lệnh sử dụng mặc định ALSA.

Đối với âm thanh được lấy mẫu, sử dụng 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 <> ")&"];]

ví dụ ALSASound[Play[Sin[1000 t^2], {t, 0, 1}], "WAV"].
Bạn cũng có thể đi Exportthẳng vào /dev/snd/thiết bị phù hợp ... nhưng tôi không thể làm việc đó được.

Để midisử dụng aplaymidi. Để làm việc này, bạn cần cài đặt một số phần mềm / phần cứng midi synth. Tôi đã timiditychạy trên cổng 128. (Xem tại đây để được giúp đỡ)

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 <> ")&"];]

ví dụ, ALSASound[Sound[SoundNote /@ CharacterRange["A", "G"]], "MIDI"]

Bây giờ bạn có thể bọc ALSASoundlệnh thích hợp xung quanh bất kỳ đối tượng âm thanh. Bạn cũng có thể xác định lại Playđể sử dụng ALSASound:

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

Điều này về cơ bản tương đương với việc thiết lập $ SoundDisplayFunction , theo khuyến nghị của nhiều cuộc thảo luận trên internet. Cài đặt tùy chọn này sẽ phát âm thanh, sau đó xuất đồ họa bình thường.

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

Chơi

nhưng các nút start / stop sẽ không hoạt động, vì chúng dựa trên EmitSound.

Để làm một Beep[]tương đương đơn giản , hãy thử

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

Cuối cùng, nếu bạn cài đặt các lễ hội text-to-speech (hoặc bất kỳ khác text-to-speech chương trình), sau đó bạn có thể thay thế Mathematica Speakchức năng, ví dụ như,

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

Simon, câu trả lời này đã lừa, cảm ơn bạn rất nhiều.
enedene

Btw, có ai biết nếu Mathematica có kế hoạch hỗ trợ âm thanh trên Linux trong tương lai không? Tôi đoán rằng chúng là phần mềm cụ thể trong đó tỷ lệ phần trăm người sử dụng nó trên Linux lớn hơn nhiều so với hầu hết các phần mềm khác.
enedene

@enedene: Tôi đã hỏi câu hỏi đó về hỗ trợ WRI ngày hôm nay. Hy vọng rằng chúng tôi sẽ nhận được câu trả lời trong vài ngày tới ...
Simon

Cảm ơn Simon, bạn đã giúp đỡ. Nếu bạn nhận được câu trả lời, xin vui lòng gửi nó ở đây hoặc cung cấp một liên kết.
enedene

@enedene: Tôi nhận được phản hồi hữu ích từ bộ phận hỗ trợ của WRI. Xem chỉnh sửa!
Simon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.