From 573a6ac6c932c93def9a24a661794280b351ff4c Mon Sep 17 00:00:00 2001 From: Florian Vahl <7vahl@informatik.uni-hamburg.de> Date: Sat, 10 Oct 2026 14:20:02 +0200 Subject: [PATCH 1/3] fix: replace conda playsound with pypi playsound3 The code imports playsound3, but only the unmaintained playsound package was declared and playsound3 is not available on the conda channels, causing a dependency error at runtime. --- pixi.lock | 56 +++++++++++++++++++++++++++---------------------------- pixi.toml | 3 ++- 2 files changed, 29 insertions(+), 30 deletions(-) diff --git a/pixi.lock b/pixi.lock index 4936a39e6..e80a7980c 100644 --- a/pixi.lock +++ b/pixi.lock @@ -562,7 +562,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pep517-0.13.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.11.8-pyh5ded981_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/playsound-1.3.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.2-pyha770c72_0.conda @@ -1020,6 +1019,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/53/60/7be26e610767316c028a2cbedb9a3beabdbe33e2182c373f71a1c0b88f36/zstandard-0.25.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/73/b1/37b6fefb2f2fe5f11ae305d0a428e1cdb4f5868112c42ab29c1ce1629f06/viser-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/c6/92fcd42f1ba33e1184263f25bfabf3d27c383410470f169e4b8163bf9c17/beautifulsoup4-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/39/93f689120673873a1328fbf94b6906a16b5ada41f33af0699f2eddc73cff/playsound3-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a7/03/921a3d3c75785aca9ebfbfcabfbc3a1be12e2ab5265deb026d55a5a3f83e/tqdm-4.70.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ae/f9/617a194c1a4203279998e1859426cf2635042533a99a93d63d3ee1fb967e/syrupy-5.5.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/d1/d4cd9fe89c7d400d7a18f86ccc94daa3f0927f53558846fcb60791dce5d6/msgspec-0.21.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl @@ -1558,7 +1558,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pep517-0.13.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.11.8-pyh5ded981_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/playsound-1.3.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.2-pyha770c72_0.conda @@ -2018,6 +2017,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/73/b1/37b6fefb2f2fe5f11ae305d0a428e1cdb4f5868112c42ab29c1ce1629f06/viser-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/c6/92fcd42f1ba33e1184263f25bfabf3d27c383410470f169e4b8163bf9c17/beautifulsoup4-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/37/655101799590bcc5fddb2bd3fe0e6194e816c2d1da7c361725f5eb89a910/msgspec-0.21.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/8b/39/93f689120673873a1328fbf94b6906a16b5ada41f33af0699f2eddc73cff/playsound3-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a7/03/921a3d3c75785aca9ebfbfcabfbc3a1be12e2ab5265deb026d55a5a3f83e/tqdm-4.70.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ae/f9/617a194c1a4203279998e1859426cf2635042533a99a93d63d3ee1fb967e/syrupy-5.5.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ea/78/9a8a174011682d71cb4922f4014ebbeb9d3067922678e7059351fd9207cf/exhale-0.3.7-py3-none-any.whl @@ -2694,7 +2694,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pep517-0.13.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.11.8-pyh5ded981_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/playsound-1.3.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.2-pyha770c72_0.conda @@ -3155,6 +3154,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/53/60/7be26e610767316c028a2cbedb9a3beabdbe33e2182c373f71a1c0b88f36/zstandard-0.25.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/73/b1/37b6fefb2f2fe5f11ae305d0a428e1cdb4f5868112c42ab29c1ce1629f06/viser-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/c6/92fcd42f1ba33e1184263f25bfabf3d27c383410470f169e4b8163bf9c17/beautifulsoup4-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/39/93f689120673873a1328fbf94b6906a16b5ada41f33af0699f2eddc73cff/playsound3-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a7/03/921a3d3c75785aca9ebfbfcabfbc3a1be12e2ab5265deb026d55a5a3f83e/tqdm-4.70.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ae/f9/617a194c1a4203279998e1859426cf2635042533a99a93d63d3ee1fb967e/syrupy-5.5.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/d1/d4cd9fe89c7d400d7a18f86ccc94daa3f0927f53558846fcb60791dce5d6/msgspec-0.21.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl @@ -3694,7 +3694,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pep517-0.13.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.11.8-pyh5ded981_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/playsound-1.3.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.2-pyha770c72_0.conda @@ -4157,6 +4156,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/73/b1/37b6fefb2f2fe5f11ae305d0a428e1cdb4f5868112c42ab29c1ce1629f06/viser-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/c6/92fcd42f1ba33e1184263f25bfabf3d27c383410470f169e4b8163bf9c17/beautifulsoup4-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/37/655101799590bcc5fddb2bd3fe0e6194e816c2d1da7c361725f5eb89a910/msgspec-0.21.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/8b/39/93f689120673873a1328fbf94b6906a16b5ada41f33af0699f2eddc73cff/playsound3-3.3.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a7/03/921a3d3c75785aca9ebfbfcabfbc3a1be12e2ab5265deb026d55a5a3f83e/tqdm-4.70.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ae/f9/617a194c1a4203279998e1859426cf2635042533a99a93d63d3ee1fb967e/syrupy-5.5.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ea/78/9a8a174011682d71cb4922f4014ebbeb9d3067922678e7059351fd9207cf/exhale-0.3.7-py3-none-any.whl @@ -4371,7 +4371,7 @@ packages: license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/bcrypt?source=compressed-mapping + - pkg:pypi/bcrypt?source=hash-mapping run_exports: {} size: 283491 timestamp: 1788505779281 @@ -4855,7 +4855,7 @@ packages: license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT license_family: BSD purls: - - pkg:pypi/cryptography?source=compressed-mapping + - pkg:pypi/cryptography?source=hash-mapping run_exports: {} size: 1896245 timestamp: 1788356239006 @@ -6254,7 +6254,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/kiwisolver?source=compressed-mapping + - pkg:pypi/kiwisolver?source=hash-mapping run_exports: {} size: 75215 timestamp: 1788505643992 @@ -10047,7 +10047,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/librt?source=compressed-mapping + - pkg:pypi/librt?source=hash-mapping run_exports: {} size: 169277 timestamp: 1788524688833 @@ -12003,7 +12003,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/brotli?source=compressed-mapping + - pkg:pypi/brotli?source=hash-mapping run_exports: {} size: 366485 timestamp: 1788480367792 @@ -12134,7 +12134,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/cffi?source=compressed-mapping + - pkg:pypi/cffi?source=hash-mapping run_exports: {} size: 325201 timestamp: 1788485261662 @@ -17646,7 +17646,7 @@ packages: license: BSD-2-Clause license_family: BSD purls: - - pkg:pypi/sip?source=compressed-mapping + - pkg:pypi/sip?source=hash-mapping run_exports: weak: - sip >=6.16.1,<6.17.0a0 @@ -19669,7 +19669,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/gitpython?source=compressed-mapping + - pkg:pypi/gitpython?source=hash-mapping run_exports: {} size: 178869 timestamp: 1788802794188 @@ -19759,7 +19759,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/imagesize?source=compressed-mapping + - pkg:pypi/imagesize?source=hash-mapping run_exports: {} size: 21467 timestamp: 1787649248672 @@ -20243,18 +20243,6 @@ packages: run_exports: {} size: 27718 timestamp: 1788959137036 -- conda: https://conda.anaconda.org/conda-forge/noarch/playsound-1.3.0-pyhd8ed1ab_1.conda - sha256: 0adc0f2657a349d3dc27da112362dd293aecedb0ae99515c309597bf833a235c - md5: 99249c0d0b9b9663c59337873b16ac63 - depends: - - python >=3.9 - license: MIT - license_family: MIT - purls: - - pkg:pypi/playsound?source=hash-mapping - run_exports: {} - size: 12785 - timestamp: 1735588579558 - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda sha256: e14aafa63efa0528ca99ba568eaf506eb55a0371d12e6250aaaa61718d2eb62e md5: d7585b6550ad04c8c5e21097ada2888e @@ -20615,7 +20603,7 @@ packages: license: MPL-2.0 license_family: OTHER purls: - - pkg:pypi/pytest-rerunfailures?source=compressed-mapping + - pkg:pypi/pytest-rerunfailures?source=hash-mapping run_exports: {} size: 26527 timestamp: 1788434181061 @@ -20643,7 +20631,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/python-discovery?source=compressed-mapping + - pkg:pypi/python-discovery?source=hash-mapping run_exports: {} size: 38928 timestamp: 1787953569064 @@ -20767,7 +20755,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/rospkg?source=compressed-mapping + - pkg:pypi/rospkg?source=hash-mapping run_exports: {} size: 32453 timestamp: 1788606519349 @@ -21247,7 +21235,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/wcwidth?source=compressed-mapping + - pkg:pypi/wcwidth?source=hash-mapping run_exports: {} size: 146490 timestamp: 1788174996551 @@ -37853,6 +37841,16 @@ packages: - tomli-w ; extra == 'toml' - pyyaml ; extra == 'yaml' requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/8b/39/93f689120673873a1328fbf94b6906a16b5ada41f33af0699f2eddc73cff/playsound3-3.3.2-py3-none-any.whl + name: playsound3 + version: 3.3.2 + sha256: fde2ca4378ae7a34d125a5965799fb1eee2af9907dbec29d394e29d28ee4137b + requires_dist: + - pywin32 ; sys_platform == 'win32' + - pyright ; extra == 'dev' + - pytest ; extra == 'dev' + - ruff ; extra == 'dev' + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/a7/03/921a3d3c75785aca9ebfbfcabfbc3a1be12e2ab5265deb026d55a5a3f83e/tqdm-4.70.1-py3-none-any.whl name: tqdm version: 4.70.1 diff --git a/pixi.toml b/pixi.toml index 795e607a5..0bab3cae5 100644 --- a/pixi.toml +++ b/pixi.toml @@ -84,7 +84,6 @@ opencv = ">=4.11.0,<5" openssh = ">=10.5p1,<11" paramiko = ">=4.0.0,<5" pkg-config = ">=0.29.2,<0.30" -playsound = ">=1.3.0,<2" portaudio = ">=19.7.0,<20" protobuf = ">=6.31.1,<7" psutil = ">=7.1.3,<8" @@ -204,6 +203,8 @@ construct = ">=2.10.56, <3" syrupy = ">=5.0.0, <6" exhale = ">=0.3.7, <0.4" mjviser = ">=0.0.12, <0.0.15" +# conda-forge has no playsound3, but the code imports it instead of the unmaintained playsound +playsound3 = ">=3.3.2,<4" [feature.robot.dependencies] ros-jazzy-nmea-msgs = ">=2.1.0,<3" From e51d734ec9573ad0e95d4e7d6125a776e2fc66d3 Mon Sep 17 00:00:00 2001 From: Cornelius Krupp Date: Mon, 12 Oct 2026 17:29:35 +0200 Subject: [PATCH 2/3] Prefer backend ffplay & add error messages. --- .../bitbots_body_behavior/behavior_dsd/actions/speak.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/actions/speak.py b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/actions/speak.py index 1feacd07a..73f7e5d19 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/actions/speak.py +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/actions/speak.py @@ -27,12 +27,14 @@ def __init__(self, blackboard, dsd, parameters): def perform(self, reevaluate=False): try: import playsound3 + playsound3.prefer_backends("ffplay") except ImportError: + self.blackboard.node.get_logger().error("Failed to import playsound3") return self.pop() try: playsound3.playsound(self.audio_file, block=False) except playsound3.playsound3.PlaysoundException: - pass + self.blackboard.node.get_logger().error("Failed to play sound file: {}".format(self.audio_file)) return self.pop() From d3fccd2bcdedd5342c8f2fe8a1a53acb14ea561c Mon Sep 17 00:00:00 2001 From: Florian Vahl <7vahl@informatik.uni-hamburg.de> Date: Mon, 12 Oct 2026 19:09:23 +0200 Subject: [PATCH 3/3] style: apply ruff formatting to speak action --- .../bitbots_body_behavior/behavior_dsd/actions/speak.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/actions/speak.py b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/actions/speak.py index 73f7e5d19..6a183d770 100644 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/actions/speak.py +++ b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/actions/speak.py @@ -27,6 +27,7 @@ def __init__(self, blackboard, dsd, parameters): def perform(self, reevaluate=False): try: import playsound3 + playsound3.prefer_backends("ffplay") except ImportError: self.blackboard.node.get_logger().error("Failed to import playsound3") @@ -35,6 +36,6 @@ def perform(self, reevaluate=False): try: playsound3.playsound(self.audio_file, block=False) except playsound3.playsound3.PlaysoundException: - self.blackboard.node.get_logger().error("Failed to play sound file: {}".format(self.audio_file)) + self.blackboard.node.get_logger().error(f"Failed to play sound file: {self.audio_file}") return self.pop()