Friday, January 26, 2018

Matrix Voice: Hardware review

Many years ago, my Math professor and I chanced upon a 3D cube maze puzzle where a metal ball had to be extracted from the transparent maze.  We tried our best to solve it, but neither of us could.  So we did the next best thing: we proved that it was unsolvable...

I bought a Matrix Voice on IndieGogo last year. The tagline was, "Open-Source Voice Platform for all". It shipped eight months late, and does very little. Read on for cautionary tale on crowdfunded ideas where the promises surpass expectations. And promises that surpass a shipped product.

Matrix Voice looked enticing: a device that captured from multiple microphones and allowed you to process it on a Raspberry PI. Seven microphones, some expansion capability with GPIO, and a development platform built upon Raspberry Pi, Linux, and standard tools. Sounds promising, so I signed up, and put $115 for a Matrix Voice board, a Raspberry PI, and May 2017 availability.

March to May is a long time, I forgot all about it. I was waiting for it to ship, I would read the quickstart guide, and much like other single board computers, I would tinker with it and make a useful gadget.

Around July last year, as I was ordering other equipment, I vaguely remembered having funded a project on Indiegogo.  So I dug up the receipt, and went over to the project page to be greeted by irate users all expecting some shipping details.  May 2017 had come and gone, and delivery dates were moving to August, which had also past.



Projects get delayed. Software can still ship with a reduced feature-set and be improved upon, hardware projects can't. In addition, building hardware is difficult and messy. At this stage, I half-expected the project to be an elaborate scam. Looking through their pitch at IndieGogo, I was surprised I fell for it. The team list didn't include any people's names, and instead had lofty titles for the team, "Senior Advisor", "Country Manager Brazil", "Innovation Manager", and "Director of Operations". Everyone gets fooled, right?

So imagine my surprise when the board finally shipped! I got a notification that a package was headed my way, and I was eager to play with a real device. The quickstart guide, while slim, mentioned the URL https://voice.matrix.one/boards and https://matrix-io.github.io/matrix-documentation.

The first link redirects to this one (https://www.matrix.one/products/voice#compatibility) instead, and is surprisingly mum on code you can use. It points to a Documentation page which talks about MATRIX Core, Matrix OS, and Matrix HAL. No reference to Matrix Voice, or how it relates to these other words. Worse, they all talk about a product called Matrix Creator, which is a different board, with a different controller, different mic array and LED setup, and completely different sensors.  The most detailed information I could find was this Matrix Voice architecture page which has gray boxes connected trivially to an FPGA.

Voice Diagram

None of the Matrix Creator projects worked on Matrix Voice. The matrix-creator-hal demo programs on this question, for instance, gave SPI errors on the Matrix Voice. Neither the microphone nor the LEDs work on the Voice. My lofty ambitions had sunk so low that I was thrilled when the code compiled.

The only project I could find that uses the Matrix Voice is this Alexa demo project. It requires two packages: matrixio-malos (a binary file run as a service) and libmatrixio-creator-hal-dev (header files that don't refer to the binary or the service).  It refers to a github project: https://github.com/matrix-io/alexa-avs-sample-app.git. The Debian packages are interesting in how little they contain.

$ dpkg-deb -R matrixio-malos_raspbian-stretch-0.2.2_armhf.deb matrixio
$ find matrixio

matrixio/usr/bin/malos
matrixio/usr/share/doc/matrixio-malos/README.Debian
matrixio/usr/share/doc/matrixio-malos/changelog.gz
matrixio/usr/share/doc/matrixio-malos/copyright
matrixio/DEBIAN/md5sums
matrixio/DEBIAN/control
matrixio/DEBIAN/postinst
matrixio/DEBIAN/prerm
matrixio/lib/systemd/system/matrixio-malos.service


$ dpkg-deb -R libmatrixio-creator-hal-dev_raspbian-jessie-0.1.4-main_armhf.deb creaor-hal-dev
$ find creaor-hal-dev

creaor-hal-dev/usr/include/matrix_hal/humidity_sensor.h
creaor-hal-dev/usr/include/matrix_hal/uart_control.h
creaor-hal-dev/usr/include/matrix_hal/everloop.h
creaor-hal-dev/usr/include/matrix_hal/everloop_image.h
creaor-hal-dev/usr/include/matrix_hal/dummy_sensor.h
creaor-hal-dev/usr/include/matrix_hal/microphone_array_location.h
creaor-hal-dev/usr/include/matrix_hal/dummy_data.h
creaor-hal-dev/usr/include/matrix_hal/fw_data.h
creaor-hal-dev/usr/include/matrix_hal/direction_of_arrival.h
creaor-hal-dev/usr/include/matrix_hal/cross_correlation.h
creaor-hal-dev/usr/include/matrix_hal/circular_queue.h
creaor-hal-dev/usr/include/matrix_hal/gpio_control.h
creaor-hal-dev/usr/include/matrix_hal/creator_memory_map.h
creaor-hal-dev/usr/include/matrix_hal/uv_data.h
creaor-hal-dev/usr/include/matrix_hal/imu_sensor.h
creaor-hal-dev/usr/include/matrix_hal/microphone_array.h
creaor-hal-dev/usr/include/matrix_hal/pressure_data.h
creaor-hal-dev/usr/include/matrix_hal/uv_sensor.h
creaor-hal-dev/usr/include/matrix_hal/wishbone_bus.h
creaor-hal-dev/usr/include/matrix_hal/mcu_firmware.h
creaor-hal-dev/usr/include/matrix_hal/matrix_driver.h
creaor-hal-dev/usr/include/matrix_hal/imu_data.h
creaor-hal-dev/usr/include/matrix_hal/pressure_sensor.h
creaor-hal-dev/usr/include/matrix_hal/humidity_data.h
creaor-hal-dev/usr/share/doc/libmatrixio-creator-hal-dev/changelog.gz
creaor-hal-dev/usr/share/doc/libmatrixio-creator-hal-dev/copyright
creaor-hal-dev/DEBIAN/md5sums
creaor-hal-dev/DEBIAN/control


The payload is bolded.  Everything else is metadata or superfluous. The instructions ask you to reboot the machine after install malos: even though it is a single binary run as a service. You could just run /usr/bin/malos as root. Looking at the source, malos writes to FIFOs in /tmp/matrix_micarray_channel_* and those are expected to be set up as audio streams in Linux.  But you'd need to know a lot about Linux and audio to get past this information. Finally, this package might work with a Matrix Creator but does not work for Matrix Voice. Since all the samples for matrixio-creator-hal fail on the Matrix Voice, the malos binary gets SPI errors. Both malos and the demo program call matrix_hal::MicrophoneArray.Read(). Both get failures.

It's no surprise many backers are having trouble getting the Alexa demo working on Matrix Voice.  One backer even said that they were just guessing what code was used in the demo video.

Finally, the Alexa Sample Github repository has a lot of setup: it installs Node, VLC, Maven, WiringPi, OpenSSL.  But the only code that ever reads a microphone is the Java sample from AVS: samples/javaclient/src/main/java/com/amazon/alexa/avs/MicrophoneLineFactory.java which reads the default mixer and the default microphone. The microphone on the Raspberry PI. This will only work if you have set up Alsa to read from the pipe in /tmp, and if you have a Matrix Creator. If you have a Matrix Voice, you'll read from the default microphone on your Raspberry Pi. Nothing calls the MicrophoneArray code from libmatrix_creator_hal.a. (which isn't even in the installation instructions). I suspect you could go through the entire Alexa Sample Github code without needing the static library. Or the header files.

The github link and the Debian packages hide the fact that none of these packages are hooked together. And as mentioned earlier, creator-hal-dev is for the Matrix Creator, not the Matrix Voice. The demo programs from creator-hal-dev all fail on the Matrix Voice. Someone copy-pasted instructions from the Alexa Matrix Creator project instructions to the Alexa Matrix Voice project and didn't notice that the instructions are wrong.

If anyone wants a Matrix Voice, rummage through my electronic trash next week. It looks like a circular board, covered in shattered promises.


There are many wonderful crowd-sourced projects and ideas. Be cautious, be realistic. Above all, be patient. Game-changing ideas and products stick around for years.

Update (29 Jan): Matrix_Alfred posted a reply on the Matrix Community forum and disabled my account from posting feedback. They are eager to hear from their backers, apparently. This is my feedback for them which I had to create another account for.  See it online before they silence that account too.