ไม่มีเสียงใน Mathematica ภายใต้ Linux


10

ฉันมีเหตุการณ์จำนวนมากใน Mathematica ที่ฉันต้องตอบโต้และมันก็ไม่ได้ตรวจสอบอย่างสม่ำเสมอเสมอไปโดยเฉพาะอย่างยิ่งเมื่อมีการเผยแพร่เหตุการณ์แบบสุ่มในเวลา
ดังนั้นฉันต้องการเพิ่มเสียงง่าย ๆ เพื่อเตือนให้ฉันไปตรวจสอบเหตุการณ์ ฉันต้องการที่จะใช้Beep[]แต่ฉันไม่ได้รับผลลัพธ์ในความเป็นจริงฉันไม่ได้ตระหนักถึงตอนนี้ที่ Mathematica ไม่ได้ทำเสียงใด ๆ

ฉันใช้ Debian Squeeze Stable และไม่มีปัญหากับแอปพลิเคชันอื่น ๆ ที่ใช้เสียง

สิ่งนี้มีผลต่อ Mathematica รุ่นล่าสุด (7, 8 และ 9) และรุ่นเก่ากว่าทั้งหมดขึ้นอยู่กับการตั้งค่าระบบเสียงของคุณ


นี่เป็นปัญหาใน Mma นับตั้งแต่ที่พวกเขาเพิ่มคำสั่งเสียงในเวอร์ชัน 6 ฉันจำได้ว่าการแก้ไขในเวลานั้น แต่ไม่ได้ใส่ใจในรุ่นที่ใหม่กว่า ลองเอกสารที่นี่
Simon

ควรย้ายคำถามนี้ไปยัง superuser หรือไม่
Simon

น่าเสียดายที่ฉันยังไม่มีเสียง

ฉันเป็นโปสเตอร์ดั้งเดิมของ Stackoverflow ขอบคุณที่บอกฉันเกี่ยวกับเว็บไซต์นี้ฉันไม่รู้ว่ามีอยู่จริง มันเยี่ยมมากที่ฉันสามารถใช้มันได้ดี
enedene

ดูเพิ่มเติมที่: unix.stackexchange.com/q/15191/2842
Simon

คำตอบ:


10

เท่าที่ฉันรู้ Mathematica ไม่เคยสนับสนุนเสียงจริง ๆ ใน Linux คำสั่งPlayถูกนำมาใช้ในเวอร์ชัน 3 และระบบเสียงทั้งหมดปรับปรุงใหม่ในเวอร์ชัน 6 หากคุณค้นหา comp.soft-sys.math.mathematica คุณจะพบคำถามที่จะย้อนกลับไปหาเวอร์ชั่น 3 ในเวอร์ชั่น 6 คำสั่งEmitSoundแนะนำ ตอนนี้รองรับการสร้างเสียง Mathematica ส่วนใหญ่ แต่ฉันไม่สามารถหาวิธีที่รวดเร็วในการแก้ไข / แฮ็กมันสำหรับ linux เนื่องจากEmitSoundทำการประมวลผลล่วงหน้าบางอย่าง (การหาว่าวัตถุชนิดใดที่ให้มา) ก่อนที่จะส่งเสียงไปยังส่วนหน้า ประเมินผล

ไดรเวอร์เสียง / API เริ่มต้นที่ใช้ในการติดตั้ง linux ส่วนใหญ่คือALSA ( wiki ) มันกลายเป็นค่าเริ่มต้นในปี 2002 ในเคอร์เนล linux 2.6 และOSSถูกทำเครื่องหมายว่า "เสื่อมค่า" (แม้ว่า OSS ยังอยู่ระหว่างการพัฒนาที่ใช้งานอยู่) ลีนุกซ์หลายรุ่นใช้PulseAudio ซึ่งอยู่บนสุดของเสียง ALSA (ใครก็ตามที่มีความเข้าใจในเสียง Linux ดีกว่าควรแก้ไขได้!)

Mathematica แนะนำเสียงในรุ่น 3 (1996) และใช้ OSS สำหรับตัวแปร * nix ยังคงเป็นกรณีนี้แม้ว่า OSS จะไม่เป็นค่าเริ่มต้นในรุ่น Linux เกือบทุกชนิดอีกต่อไป การรู้สิ่งนี้ทำให้เรามีทางออกที่เป็นไปได้: ใช้เลเยอร์การจำลอง OSS (ดูตัวอย่างเช่นhttp://wiki.debian.org/SoundFAQ )

ที่ง่ายที่สุดคือการใช้การจำลองโหมด userspace และรัน Mathematica ผ่าน aoss

aoss mathematica

หรือเทียบเท่า PulseAudio

padsp mathematica

ปัญหาของทั้งสองสิ่งนี้คือใช้งานได้กับเสียง MIDI เท่านั้นไม่ใช่เสียงตัวอย่าง อย่างน้อยก็เป็นจริงในระบบ Ubuntu 10.10 ของฉันและระบบ linux ของ Scott Kruger (จากทีมสนับสนุนด้านเทคนิคของWRI ) มีการรายงานข้อผิดพลาดเกี่ยวกับปัญหานี้

หรือคุณสามารถโหลดความเข้ากันได้ของ OSS ลงในเคอร์เนลของคุณ

apt-get install alsa-oss
modprobe snd_pcm_oss
modprobe snd_mixer_oss

และคุณสามารถเพิ่มsnd_pcm_ossและsnd_mixer_ossเพื่อ/etc/modules ที่จะโหลดพวกเขาที่ boottime โมดูลเหล่านี้ไม่พร้อมใช้งานใน 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 synth ฉัน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}]

เล่น

แต่ปุ่ม START / STOP EmitSoundจะไม่ทำงานเนื่องจากพวกเขาจะขึ้นอยู่กับ

หากต้องการทำให้ง่ายBeep[]เทียบเท่าลอง

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

ในที่สุดถ้าคุณติดตั้งเทศกาลข้อความเป็นคำพูด (หรือโปรแกรมข้อความเป็นคำพูดอื่น ๆ) จากนั้นคุณสามารถแทนที่Speakฟังก์ชั่นMathematica เช่น

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

Simon คำตอบนี้ใช้กลอุบายขอบคุณมาก
enedene

Btw ไม่มีใครรู้ว่า Mathematica วางแผนที่จะรองรับเสียงบน Linux ในอนาคตหรือไม่ ฉันเดาว่ามันเป็นซอฟต์แวร์เฉพาะที่มีเปอร์เซ็นต์ของผู้ใช้บน Linux มากกว่าซอฟต์แวร์อื่น ๆ ส่วนใหญ่
enedene

@enedene: ฉันถามคำถามของการสนับสนุน WRI ในวันนี้ หวังว่าเราจะได้รับคำตอบในอีกไม่กี่วันข้างหน้า ...
Simon

ขอบคุณ Simon คุณได้รับประโยชน์ หากคุณได้รับคำตอบโปรดโพสต์ไว้ที่นี่หรือให้ลิงค์
enedene

@enedene: ฉันได้รับคำตอบที่เป็นประโยชน์จากการสนับสนุน WRI ดูการแก้ไข!
Simon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.