Table of Contents

Wii Speak on PC

It's only been 7 years? No love for Wii Speak :(

I finally got the light to turn on and some data to stream in using C#. I'll experiment some more and write up some documentation one day.

Open up a Wii Speak compatible title's DOL file in a hex editor and find a blob that starts with AE 2F DD EC, from there jump down 0x17CC7 (decimal 97479) bytes to what ends in FD 22 BA FA. You might want to put that blob into its own file because it needs to be sent to Wii Speak every time to initialize it. For legal reasons you shouldn't share the firmware blob. Wii Speak Channel can be obtained using NUSD.

There's more to it than just sending the firmware!

// Using LibUsbDotNet, use Zadig to use the libusb0 driver for Wii Speak.
BulkWriter = _USBDevice.OpenEndpointWriter(WriteEndpointID.Ep02, EndpointType.Bulk);
byte[] _firmware = File.ReadAllBytes("WiiSpeak-Firmware.bin");
void SendFirmware() {
	int bytesTransferred = -1;
	int segmentsize = 1024;
	byte[] segment = new byte[segmentsize];
	for (int i = 0; i < _firmware.Length; i += segmentsize)
	{
		int rem = segmentsize;
		if (i + 1024 > _firmware.Length)
			rem = _firmware.Length - i;
		Buffer.BlockCopy(_firmware, i, segment, 0, rem);
		BulkWriter.Write(segment, 0, rem, 5000, out bytesTransferred);
	}
}

Audio

With a PCAPNG USB capture of Wii Speak with Dolphin under Linux it's fairly easy to playback the approximate audio sent and received to/from Wii Speak. Just join all the isochronous data together and import into Audacity as raw audio. The following is from the Wii Speak Channel capture:

Dolphin Registers

The 0x9A control messages from Dolphin Emulator old Wii Speak branch code. I've marked the ones that I haven't seen appear under Wii Speak Channel usage as unconfirmed.

With EC_STATE you should always see: 1 sent/read then 0 sent/read straight after.

Misc Notes

Wii Party-Mic Descriptor - VID: 0x057e - PID: 0x0308

Credits