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 accessibility 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.

Due to the design of the API many existing add-ons extend application GUIs by reading events emmitted by controls. Unfortunately Voicemeeter was written (I think, using the Win32 API in C) and does not emit the kind of events the NVDA API requires. For this reason extending the current GUI was not an option, instead I opted to create a separate GUI application that hooked into NVDA with it's controller client.

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 menu:

Settings menu

In conformity 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:

Channel buttons

As you can see in the Potato version there are rather 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:

Channel sliders

Finally I added a menu element.

menu

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.