ปัญหาเสียงผิดเพี้ยนใน Ubuntu 24.04 อาจเกิดจากหลายสาเหตุ ได้แก่ แอปพลิเคชัน, PipeWire, WirePlumber, ALSA, ไดรเวอร์เคอร์เนล หรือฮาร์ดแวร์เสียงเอง วิธีการแก้ไขที่ได้ผลคือการระบุอุปกรณ์ที่ได้รับผลกระทบก่อน จากนั้นจึงเปลี่ยนการตั้งค่าบัฟเฟอร์หรืออุปกรณ์ทีละรายการ บนเดสก์ท็อป Ubuntu 24.04 มาตรฐาน PipeWire จะอยู่เหนือ ALSA และ WirePlumber จะจัดการอุปกรณ์ ALSA ดังนั้นผู้ใช้ส่วนใหญ่ควรปรับแต่งคุณสมบัติ ALSA ที่แสดงผ่าน WirePlumber ก่อนที่จะแทนที่การกำหนดค่า ALSA เริ่มต้นของระบบ
Ubuntu 24.04 เดิมทีมาพร้อมกับ PipeWire เวอร์ชัน 1.0.4 และแพ็คเกจ Noble ปัจจุบันของ Ubuntu ยังคงใช้ WirePlumber เวอร์ชัน 0.4.17 แทนที่จะใช้รูปแบบการกำหนดค่าเวอร์ชัน 0.5 ที่ใหม่กว่า รายละเอียดเวอร์ชันนี้มีความสำคัญเนื่องจาก WirePlumber เวอร์ชัน 0.4 ใช้ส่วนประกอบ Lua ภายใต้ <configuration.h> ไวยากรณ์ ~/.config/wireplumber/main.lua.d/ใหม่กว่าที่wireplumber.conf.dคุณอาจเห็นในเอกสารต้นฉบับปัจจุบันนั้นใช้กับ WirePlumber เวอร์ชัน 0.5 และเวอร์ชันที่ใหม่กว่า ตรวจสอบเวอร์ชันที่ติดตั้งก่อนคัดลอกการกำหนดค่าใดๆ
เอกสารอ้างอิงอย่างเป็นทางการ: บันทึกการเผยแพร่ Ubuntu 24.04 LTS , แพ็คเกจ WirePlumber ของ Ubuntu สำหรับการอัปเดต Noble , เอกสารอ้างอิงการกำหนดค่า WirePlumber 0.4 ALSAและเอกสารอ้างอิงปลั๊กอิน ALSA PCM
คู่มือฉบับย่อ: ควรลองอะไรก่อนเป็นอันดับแรก
| อาการ | การตรวจสอบภาคปฏิบัติครั้งแรก | การปรับแต่งที่เป็นไปได้ |
| เสียงแตกดังขณะซีพียูทำงานหนัก | ตรวจสอบให้แน่ใจว่าต่อกับอ่างล้างจานถูกต้อง และคอยสังเกตว่ามีน้ำหยดหรือไม่ | ทดสอบขนาดช่วงเวลา ALSA ที่ใหญ่ขึ้น เช่น 1024 หรือ 2048 เฟรม |
| เกิดการบิดเบือนเฉพาะบน USB DAC ตัวเดียวเท่านั้น | ระบุโหนด ALSA/PipeWire ที่แน่นอน | ใช้กฎนี้เฉพาะกับโหนดนั้นเท่านั้น หลีกเลี่ยงการใช้กฎกับทั้งระบบ |
| เสียงดังเมื่ออุปกรณ์ตื่นจากการไม่ได้ใช้งาน | เริ่มเล่นอีกครั้งหลังจากเงียบไปหลายวินาที | เพิ่มหรือปิดใช้งานระยะเวลาหมดเวลาการระงับสำหรับโหนดนั้นๆ |
| ปัญหาในแอปพลิเคชันรุ่นเก่าที่ใช้ ALSA เพียงอย่างเดียว | ทดสอบแอปโดยใช้aplayPCM ที่ระบุอย่างชัดเจน | ใช้การตั้งค่าต่อผู้ใช้~/.asoundrcด้วยplug/dmix |
| ความผิดเพี้ยนที่อัตราการสุ่มตัวอย่างหนึ่งค่า | ทดสอบวัสดุที่ความถี่ 44.1 kHz และ 48 kHz | เลือกอัตราฮาร์ดแวร์ที่รองรับ และปล่อยให้ PipeWire ทำการสุ่มตัวอย่างใหม่เมื่อจำเป็น |
1. ระบุฮาร์ดแวร์ ALSA และส่วนประกอบด้านเสียง
เริ่มต้นด้วยการตรวจสอบรายชื่ออุปกรณ์เล่นเสียงและตรวจสอบว่าเซิร์ฟเวอร์เสียงใดทำงานอยู่ อย่าคิดว่านั่นhw:0,0คือลำโพงของคุณเสมอไป เพราะอุปกรณ์ HDMI, ชุดหูฟัง USB, เว็บแคม และแท่นวางอาจเปลี่ยนหมายเลขการ์ดระหว่างการบูตเครื่องได้
aplay -l
wpctl status
pactl info
wireplumber --version
pipewire --version
คำบรรยายภาพ: aplay -lรายการดังกล่าวแยกอุปกรณ์เล่นสัญญาณอนาล็อกในตัวออกจาก HDMI ซึ่งช่วยหลีกเลี่ยงการปรับแต่ง ALSA กับการ์ดผิดตัว
หากpactl infoแสดงข้อความ “PulseAudio (on PipeWire)” นั่นเป็นเรื่องปกติใน Ubuntu 24.04 อินเทอร์เฟซที่เข้ากันได้กับ PulseAudio นั้นถูกจัดเตรียมโดย PipeWire สำหรับ Ubuntu 24.04/Noble เวอร์ชันมาตรฐานwireplumber --versionควรแสดงซีรี่ส์ 0.4.x เว้นแต่คุณจะติดตั้งเวอร์ชันอื่น
2. ตรวจสอบความผิดเพี้ยนก่อนเปลี่ยนการตั้งค่า
ควรใช้การทดสอบที่สามารถทำซ้ำได้ แทนที่จะตัดสินการเปลี่ยนแปลงจากวิดีโอเว็บแบบสุ่ม ไฟล์ WAV สั้นๆspeaker-testหรือแทร็กเพลงที่รู้จัก จะทำให้การเปรียบเทียบก่อนและหลังมีความหมายมากขึ้น ตรวจสอบด้วยว่าปัญหาเกิดขึ้นกับเอาต์พุตแบบอนาล็อก HDMI บลูทูธ และ USB อย่างเท่าเทียมกันหรือไม่ หากมีเพียงเส้นทางเดียวที่ได้รับผลกระทบ ให้จำกัดการแก้ไขไปที่เส้นทางนั้น
speaker-test -c 2 -t wav
aplay /usr/share/sounds/alsa/Front_Center.wav
สำหรับอุปกรณ์ USB เคอร์เนลจะแสดงข้อมูลสตรีมไว้ภายใต้/proc/asound/เส้นทางที่แน่นอนจะแตกต่างกันไปตามการ์ด ดังนั้นควรตรวจสอบ/proc/asound/cardsก่อนแทนที่จะคัดลอกหมายเลขการ์ดโดยไม่ตรวจสอบ
คำบรรยายภาพ: ข้อมูลสตรีม ALSA สามารถแสดงอัตราการสุ่มตัวอย่างที่ใช้งานอยู่ จำนวนช่องสัญญาณ และรูปแบบการสุ่มตัวอย่างสำหรับสตรีมการเล่น หมายเลขการ์ดขึ้นอยู่กับฮาร์ดแวร์
3. สำรองข้อมูลการตั้งค่าผู้ใช้ปัจจุบัน
ก่อนแก้ไขอะไรก็ตาม โปรดเก็บรักษาการตั้งค่า ALSA หรือ WirePlumber ที่มีอยู่เดิมไว้ การเปลี่ยนแปลงในระดับผู้ใช้จะปลอดภัยกว่าการแก้ไขไฟล์ในระดับผู้ดูแล/usr/shareระบบ เนื่องจากแพ็กเกจอัปเกรดอาจแทนที่ไฟล์ระบบได้
cp -a ~/.asoundrc ~/.asoundrc.backup 2>/dev/null || true
mkdir -p ~/.config/wireplumber/main.lua.d
cp -a ~/.config/wireplumber/main.lua.d ~/.config/wireplumber/main.lua.d.backup 2>/dev/null || true
หากคุณเคยคัดลอกการตั้งค่าจากคู่มือที่เขียนขึ้นสำหรับ WirePlumber 0.5 โปรดลบหรือย้ายการตั้งค่าดังกล่าวออกไปก่อนทำการทดสอบบน Ubuntu 24.04 เวอร์ชันมาตรฐาน เนื่องจาก WirePlumber 0.4 และ 0.5 ใช้รูปแบบการตั้งค่าที่แตกต่างกัน
4. ปรับแต่งพฤติกรรมบัฟเฟอร์ ALSA ผ่าน WirePlumber 0.4
ใน Ubuntu 24.04 การปรับแต่งระดับ ALSA นี้มักจะมีความสำคัญที่สุด เนื่องจาก WirePlumber สร้างและกำหนดค่าโหนด PipeWire ที่รองรับ ALSA เอกสาร WirePlumber ต้นฉบับอธิบายapi.alsa.period-sizeว่าขนาดของช่วงเวลาเป็นตัวอย่าง และapi.alsa.headroomเป็นการบัฟเฟอร์เพิ่มเติมระหว่างตัวชี้ฮาร์ดแวร์และซอฟต์แวร์ อุปกรณ์ USB ส่วนใหญ่จะถูกมองว่าเป็นอุปกรณ์แบบแบตช์ และขนาดของช่วงเวลาจะมีผลต่อทั้งความถี่ของการขัดจังหวะและพฤติกรรมการบัฟเฟอร์
สร้างกฎสำหรับผู้ใช้:
nano ~/.config/wireplumber/main.lua.d/51-alsa-tuning.lua
ใช้กฎที่กำหนดเป้าหมายเฉพาะโหนดเอาต์พุตที่มีปัญหา ก่อนอื่นให้รับชื่อโหนดด้วยwpctl statusหรือpw-cli list-objects Nodeจากนั้นปรับตัวอย่างนี้:
local rule = {
matches = {
{
{ "node.name", "matches", "alsa_output.*" },
},
},
apply_properties = {
["api.alsa.period-size"] = 1024,
["api.alsa.headroom"] = 0,
},
}
table.insert(alsa_monitor.rules, rule)
อย่าถือว่า 1024 เป็นค่าวิเศษที่ใช้ได้กับทุกกรณีมันเป็นเพียงค่าทดสอบแบบระมัดระวังเท่านั้น หากยังคงมีความผิดเพี้ยนอยู่ ให้ลองเปรียบเทียบ 512, 1024 และ 2048 ทีละค่า ช่วงเวลาที่ยาวขึ้นอาจช่วยเพิ่มความทนทานต่อความล่าช้าในการจัดตารางเวลาในบางระบบ แต่จะเพิ่มความหน่วง ช่วงเวลาที่สั้นลงอาจลดความหน่วงได้ แต่จะเพิ่มความถี่ในการขัดจังหวะและอาจทำให้เกิดข้อผิดพลาดในการประมวลผลบนเครื่องที่มีภาระหนัก ให้เลือกค่าที่เล็กที่สุดที่ยังคงเสถียรสำหรับปริมาณงานของคุณ
หากอุปกรณ์มีปัญหาเกี่ยวกับ I/O ที่แมปหน่วยความจำ WirePlumber ก็จะแสดงตัวเลือก นี้ออกมา api.alsa.disable-mmapด้วย เอกสารต้นฉบับระบุอย่างชัดเจนว่านี่เป็นวิธีแก้ไขปัญหาเพื่อความเข้ากันได้ และระบุว่าการเข้าถึงการอ่าน/เขียนจะช้าลง ดังนั้นอย่าเปิดใช้งานเว้นแต่ว่าความผิดปกติจะสัมพันธ์กับพฤติกรรมของ mmap อย่างชัดเจน
["api.alsa.disable-mmap"] = true,
อีกหนึ่งตัวเลือกเฉพาะอุปกรณ์คือsession.suspend-timeout-seconds. หาก DAC มีเสียงแตกหรือเสียงผิดเพี้ยนทุกครั้งที่ตื่นขึ้น การทดสอบด้วยการตั้งค่าหมดเวลาที่นานขึ้น หรือ0ปิดใช้งานการระงับการทำงานสำหรับโหนดนั้น อาจช่วยแยกสาเหตุได้ การปิดใช้งานการระงับการทำงานจะทำให้อุปกรณ์ ALSA ทำงานอยู่ตลอดเวลา ดังนั้นจึงเป็นการแลกเปลี่ยนมากกว่าคำแนะนำเริ่มต้น
5. ใช้ไฟล์ .asoundrc เฉพาะเมื่อแอปพลิเคชันใช้งาน ALSA โดยตรงเท่านั้น
การตั้ง ค่าต่อผู้ใช้~/.asoundrcจะมีประโยชน์สำหรับแอปพลิเคชันรุ่นเก่าที่ข้าม PipeWire และเปิด ALSA PCM โดยตรง นอกจากนี้ยังอาจมีประโยชน์สำหรับการทดสอบอัตราการสุ่มตัวอย่างคงที่หรือพฤติกรรมการผสมเสียงด้วยซอฟต์แวร์ อย่างไรก็ตาม การแทนที่ค่าเริ่มต้นของ ALSA ทั่วโลกอาจรบกวนปลั๊กอิน PipeWire ALSA ดังนั้นควรใช้ PCM ที่มีชื่อเมื่อเป็นไปได้แทนที่จะpcm.!defaultแทนที่
ตัวอย่างเช่นdmixปลั๊กอินของ ALSA รองรับ ค่า rate, period_size, และ ที่ระบุอย่างชัดเจน buffer_sizePCM สำหรับการทดสอบที่มีชื่อสามารถมีลักษณะดังนี้:
pcm.stable_test {
type plug
slave.pcm "stable_dmix"
}
pcm.stable_dmix {
type dmix
ipc_key 2048
ipc_key_add_uid true
slave {
pcm "hw:0,0"
rate 48000
period_time 0
period_size 1024
buffer_size 4096
}
}
แทนที่hw:0,0ด้วยการ์ดและอุปกรณ์จริงจาก [แหล่งaplay -lอ้างอิง] จากนั้นทดสอบโดยไม่ต้องเปลี่ยนค่าเริ่มต้นของระบบ:
aplay -D stable_test /usr/share/sounds/alsa/Front_Center.wav
คำบรรยายภาพ: ผู้ใช้.asoundrcสามารถกำหนดพารามิเตอร์ ALSA แบบคงที่สำหรับการทดสอบแบบควบคุมได้hwควรใช้เป้าหมายโดยตรงอย่างระมัดระวัง เนื่องจากจะข้ามการแปลงรูปแบบอัตโนมัติ
โครงการ ALSA ระบุว่าdmixมีการกำหนดค่าพื้นฐานคงที่ เว้นแต่คุณจะระบุค่าในคำจำกัดความของอุปกรณ์ลูกข่าย ในขณะที่plugปลั๊กอินสามารถทำการแปลงรูปแบบและอัตราได้ นั่นเป็นเหตุผลว่าทำไมการรวมplugPCM ที่มีชื่อเข้ากับ PCM ที่ปรับแต่งแยกต่างหากdmixจึงปลอดภัยกว่าสำหรับการทดลอง มากกว่าการบังคับให้ทุกโปรแกรมเปิดฮาร์ดแวร์ดิบโดยตรง
6. รีสตาร์ทบริการเสียงของผู้ใช้และทดสอบอีกครั้ง
หลังจากเปลี่ยนกฎของ WirePlumber แล้ว ให้รีสตาร์ทระบบเสียงของผู้ใช้ โดยปิดแอปพลิเคชันที่กำลังใช้งานเสียงอยู่ก่อน
systemctl --user restart wireplumber pipewire pipewire-pulse
จากนั้นให้ทำการทดสอบซ้ำโดยใช้สื่อการทดสอบเดียวกันกับที่ใช้ก่อนการเปลี่ยนแปลง เปิดการตั้งค่า > เสียงและตรวจสอบให้แน่ใจว่าอุปกรณ์เอาต์พุตและโปรไฟล์ที่ต้องการยังคงถูกเลือกอยู่
คำบรรยายภาพ: หลังจากรีสตาร์ทบริการเสียงแล้ว โปรดตรวจสอบว่า Ubuntu ยังคงเลือกอุปกรณ์เอาต์พุตและโปรไฟล์ที่ต้องการก่อนที่จะตัดสินว่าปัญหาเสียงผิดเพี้ยนได้รับการแก้ไขแล้วหรือไม่
วิธีตรวจสอบว่าการปรับแต่งได้ผลหรือไม่
- ไฟล์ทดสอบเดียวกันสามารถเล่นซ้ำได้โดยไม่มีเสียงแตก เสียงรบกวน เสียงขาดหาย หรือเสียงกระตุกเป็นช่วงสั้นๆ
- อาการผิดเพี้ยนจะไม่กลับมาอีกหลังจากอุปกรณ์อยู่ในโหมดไม่ได้ใช้งานและตื่นขึ้นมาใช้งานอีกครั้ง
- แอปพลิเคชันบนเดสก์ท็อปทั่วไป เว็บเบราว์เซอร์ และการสนทนาทางวิดีโอ ยังคงใช้อุปกรณ์แสดงผลตามที่คาดไว้
- ความหน่วงยังอยู่ในระดับที่ยอมรับได้สำหรับการใช้งานของคุณ การเล่นเพลงสามารถทนต่อการบัฟเฟอร์ได้มากกว่าการตรวจสอบแบบเรียลไทม์หรือการเล่นเกม
- การแก้ไขปัญหานี้ยังคงเสถียรแม้หลังจากออกจากระบบแล้วเข้าสู่ระบบใหม่ หรือรีบูตเครื่องแล้ว
เมื่อการปรับแต่ง ALSA ไม่ใช่วิธีแก้ปัญหาที่ถูกต้อง
อย่าเพิ่มบัฟเฟอร์ต่อไปเรื่อย ๆ หากอาการที่เกิดขึ้นชัดเจนว่าเป็นปัญหาจากการตัดสัญญาณของฮาร์ดแวร์ สายเคเบิลหลวม อินพุตอะนาล็อกที่ถูกขับเกินกำลัง ฮับ USB ที่เสีย หรือลำโพงเสีย นอกจากนี้ ให้ตรวจสอบระดับเสียงของมิกเซอร์ด้วย เพราะalsamixerเสียงผิดเพี้ยนที่เกิดขึ้นเฉพาะที่ระดับเสียงใกล้ 100% อาจเกี่ยวข้องกับเกนมากกว่าปัญหาการเรียงลำดับสัญญาณ
หากปัญหาเริ่มเกิดขึ้นหลังจากการอัปเดตเคอร์เนลหรือเฟิร์มแวร์ ให้ทดสอบเคอร์เนลอื่นที่รองรับจากเมนู GRUB ก่อนที่จะสร้างกฎเสียงที่ซับซ้อนขึ้นเรื่อยๆ หากมีปัญหาเฉพาะกับบลูทูธ ให้เน้นที่ตัวแปลงสัญญาณ/โปรไฟล์บลูทูธมากกว่าการตั้งค่าช่วงเวลา ALSA หากมีปัญหาเฉพาะกับ HDMI ให้ตรวจสอบโปรไฟล์ HDMI และตัวรับ/จอภาพก่อน
รายการตรวจสอบการย้อนกลับ
- ลบหรือเปลี่ยน
~/.config/wireplumber/main.lua.d/51-alsa-tuning.luaชื่อ
- กู้คืน
~/.asoundrcจากข้อมูลสำรอง หรือลบไฟล์ทดสอบเท่านั้น
- เริ่มใหม่
wireplumber, pipewire, และpipewire-pulse.
- เรียกใช้งานอีกครั้ง
wpctl statusเพื่อspeaker-testยืนยันว่าการทำงานตามค่าเริ่มต้นกลับมาแล้ว
สรุปแล้ว
สำหรับ Ubuntu 24.04 ให้เริ่มต้นด้วยการใช้กฎ ALSA ของ WirePlumber 0.4 ที่กำหนดเป้าหมาย แทนที่จะเปลี่ยนทั้งระบบ.asoundrcระบุโหนดเอาต์พุตที่แน่นอน เปลี่ยนคุณสมบัติทีละรายการ และเปรียบเทียบเสียงทดสอบเดียวกันหลังจากทุกการเปลี่ยนแปลง ขนาดช่วงเวลา เช่น 1024 เป็นจุดเริ่มต้นการวินิจฉัยที่เหมาะสม แต่ค่าที่ถูกต้องจะขึ้นอยู่กับอุปกรณ์และปริมาณงาน สงวนการระงับdisable-mmapการเปลี่ยนแปลงและdmixPCM แบบกำหนดเองไว้สำหรับกรณีที่การทดสอบของคุณชี้ไปที่พฤติกรรมเหล่านั้นโดยเฉพาะ