Wii Speak on PC
No update from me since 2017. Dolphin Emulator team made so much more progress in 2025.
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 (future edit: lies).
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. 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:
- iso_in = Signed 16-Bit PCM Big Endian Mono 8000 Hz
- iso_out = Signed 32-Bit PCM Big Endian Stereo 8000 Hz or 16-Bit PCM 16000 Hz (I can’t tell the difference)
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.
- 0 - SAMPLER_STATE (on/off)
- 2 - SAMPLER_FREQ_A
- 3 - SAMPLER_FREQ_B
- 0 - 8000 KHz (Wii Speak Channel default)
- 1 - 11025 KHz
- 3 - 16000 KHz
- 4 - SAMPLER_GAIN (arg1 & ~0x300) unconfirmed
- 1 - 0 dB
- 2 - 15 dB
- 3 - 30 dB
- 4 - 16 dB
- 12 - SAMPLER_MUTE (on/off)
- 20 - EC_STATE (ec_reset on/off) Echo Cancellation?
- 56? - SP_STATE unconfirmed
- 4112 - SP_ENABLE
- 8193 - SP_SIN
- 8196 - SP_OUT
- 8205 - SP_RIN
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
- Dolphin Emulator - Specifically the dummy Wii Speak branch
- Future edit: they made lots more progress since then.
- Matlo’s serialusb - cheap USB proxy firmware and software. I was never able to hack isochronous support into the firmware but it confirmed some of the data obtained using Dolphin before they added USB passthrough.