Voicemeeter Accessibility for the Blind
Voicemeeter is an excellent application for those who can navigate it with ease, however, for those with accessibility needs it can be a very frustrating experience. I know this for sure having spoken to a number of visually impaired users.
After being approached by Mario Loreti, an Italian voice talent who uses Voicemeter in his professional work, I decided to take on the task of developing an accessible app that would work with a screen reader.
Step one, pick the screen reader. I chose NVDA since it's open source, offers an extensive API, an add-on ecosystem and even a Controller Client exposing functions through a standard Windows DLL.
Most NVDA add-ons take one of two forms:
- an extension to an existing GUI that reads events emitted by user controls
- a standalone application that hooks into the Controller client
Voicemeeter was written using the Win32 API in C, therefore, it does not emit the kind of events required by the NVDA API. For this reason my only option was to develop a standalone application.
Step two, choose the language and framework. I strongly considered C# and WPF but given I had a lot of new accessibility topics to learn and having already written a Voicemeeter GUI in python, I decided to stick with the familiar. That said, I didn't want to simply write another GUI in Tkinter so I chose to investigate PySimpleGUI. It's essentially a wrapper around multiple frameworks but it offers some interesting ideas which I'll go into in the follow up post.
Next I had to decide on the layout of the application. As outlined in the software specification, Voicemeeter comes in three versions, Basic, Banana and Potato. Each scales differently and some controls exist only for certain versions. All of this had to be considered when developing the NVDA Voicemeeter application.
I knew beforehand there were two particular areas of difficulty for visually impaired users, the settings menu and the GUI sliders. So I started with the settings tab:
In order to conform with the software specification you will see that all elements of the GUI are standard Windows controls. Each of the Hardware In/Out buttons offers context menus, Patch ASIO Inputs to Strips use spinboxes while Patch Inserts use checkboxes.
Next I decided to layout the channel buttons:
As you can see in the Potato version there are a lot of buttons, so after some discussion with Mario I decided to split the buttons from the sliders using nested tabs.
Here are the sliders:
Finally I added a menu element.
It's simple but important, giving users the option to save current settings (as a standard Voicemeeter XML profile), load previous settings and set a profile to load automatically on launch.
I will write a follow up post going into more detail about the code and the PySimpleGui library.
You may check out the source code along with usage instructions.
For a user friendly version of the README check the NVDA Voicemeeter page on our site. You will also find download links for pre-build releases.
Subscribe to this blog's RSS feed