Voice Recognition Module V3
User manual | English edition | R4
Train short voice commands, load the commands you need, and receive a record ID when a trained command is recognized. VR3 performs recognition on the module and is designed for speaker-dependent operation.
| 80 stored records | 7 active commands | 1.5 s per command |
|---|---|---|
| Record IDs 0-79 (decimal). | Choose up to seven trained records for the active recognizer. | Use a short word or phrase and record it twice during training. |
For an Arduino application, use the examples on pages 9-10. For another host controller, use the UART protocol reference on pages 11-24.
Read this first
A map of the manual and the three operations every application needs.
| Section | Pages | Use it when you need to... |
|---|---|---|
| Product and concepts | 3-5 | Check electrical requirements and understand records, slots and serial routes. |
| Direct PC testing | 6-8 | Connect a USB-TTL adapter, train two commands and read recognition events. |
| Arduino examples | 9-10 | Compile the supplied examples and use their text commands. |
| UART protocol | 11-20 | Build a host driver or inspect complete command frames. |
| Groups and events | 21-24 | Use external group selection, user groups and event decoding. |
| Troubleshooting and reference | 25-26 | Check common failures, test your application and consult the revision history. |
Keep these terms separate
Record: a voice template stored in Flash. Slot: one of seven positions in the active recognizer. Signature: a text label associated with a record. Group: a set of record IDs used to replace the active list.
Product specifications
Electrical, mechanical and recognition specifications.
| Item | Specification |
|---|---|
| Supply voltage | 4.5-5.5 V |
| Current | Less than 40 mA |
| Digital interface | 5 V TTL UART and GPIO |
| Microphone interface | 3.5 mm mono microphone connector and microphone pin interface |
| Board size | 31 mm x 50 mm |
| Stored voice records | Up to 80; record IDs 0-79 (decimal) |
| Simultaneously active records | Up to 7 |
| Maximum command duration | 1500 ms; typically a short word or phrase |
| Recognition accuracy | 99% under ideal conditions |
The current and accuracy specifications do not include detailed measurement conditions. Actual results depend on the operating environment, speaker and microphone placement.
Interfaces and labels
| Label | Function |
|---|---|
| VCC / GND | Module supply and common ground. |
| TXD / RXD | UART output from VR3 / UART input to VR3. Cross these to the host receiver/transmitter. |
| IN0-IN2 | External group-selection inputs. |
| OUT0-OUT6 | Recognition-related digital outputs; confirm slot-to-output mapping before integration. |
Use the labels printed on your board. Board photographs are for orientation; they are not a dimensioned footprint or a connector pin-number specification.
Records and the active recognizer
Store up to 80 templates; activate up to 7 of them at a time.
Train a record to store a voice template. Load a trained record to make it eligible for recognition. A trained record that has not been loaded is not part of the current recognition set. Sounds can also be trained; short, distinct words are easier to use consistently.
| Operation | Stored records | Active recognizer |
|---|---|---|
| Train record 7 | Creates or updates record 7. | Training alone does not define your final active list. |
| Load 0, 1, 7 | Templates remain stored. | Makes those trained records active. |
| Clear recognizer | Saved templates remain available. | Empties the list and stops recognition. |
| Power cycle | Check stored training status after restart. | Reload, or use configured power-on auto load. |
Groups let you select a different set of records for the same seven-slot recognizer. Loading a group replaces the active list; it does not add another recognition engine.
Choose your serial route
The PC-facing speed and the module-facing speed are different in the Arduino examples.
| Route | PC sends | Serial setup |
|---|---|---|
| Arduino training example | Text such as sigtrain 0 ON. The sketch constructs the module frame. | PC to Arduino: 115200, newline enabled. Arduino to VR3: 9600 by default. |
| Direct USB-TTL | Complete binary frames, entered in HEX-send mode. | PC to VR3: 9600 by default; 8 data bits, no parity, 1 stop bit, no flow control. |
| Arduino bridge example | Text containing command/data HEX bytes only. The sketch adds the framing. | PC to Arduino: 115200, newline enabled. |
Direct PC test: connect and check
Use this route to test VR3 without an Arduino board.
1. Disconnect USB power. Connect 5 V to VCC, GND to GND, adapter TXD to VR3 RXD, and adapter RXD to VR3 TXD. Plug the microphone into VR3, then connect USB to the PC.
2. Install the adapter driver if needed and identify its serial port. Open a serial utility that supports raw HEX transmission, such as AccessPort.
| Setting | Value |
|---|---|
| Baud rate | 9600 bit/s by default |
| Data / parity / stop | 8 / None / 1 |
| Send | HEX; no automatically appended CR or LF; periodic send off |
| Receive | HEX for validation; character view for training prompts |
AA 02 00 0AA settings reply starts with AA 08 00 and ends with 0A. Other bytes depend on the saved settings. If there is no reply, check wiring, the port, the signal level and the baud rate before training.
Direct PC test: train two commands
Train one record at a time and follow the module's microphone prompts.
| Record | Spoken command | Signature bytes |
|---|---|---|
| 0 | On | ON = 4F 4E |
| 1 | Off | OFF = 4F 46 46 |
AA 05 21 00 4F 4E 0AWhen Speak now appears, say "On" once. When Speak again appears, repeat the same command. Use the module microphone, keep a stable voice and wait for the recording indication. If the two recordings do not match, follow the next prompt or retry after timeout.
AA 06 21 01 4F 46 46 0ARepeat the process, saying "Off" both times. The signature is only a label; it does not determine what you must say. Each spoken command must fit within 1.5 seconds. Both LEDs flash rapidly on failure and more slowly after successful training.
Direct PC test: load and recognize
A successful training operation is followed by loading the trained records.
AA 07 21 01 00 00 4F 4E 0A
AA 08 21 01 01 00 4F 46 46 0AAfter 21: N is the successful-training count, followed by the record ID, its result and the signature. For one successful record, N=01 and the result is 00.
AA 04 02 00 01 0AIn a 02 reply, inspect each record/status pair: status 01 means trained and 00 means untrained. Do not confuse that status with training-result 00, which means success. See page 14 for the full reply layout.
AA 02 31 0A
AA 04 30 00 01 0AAA 03 31 00 0A
AA 07 30 02 00 00 01 00 0ALoading starts recognition immediately. Say "On" or "Off". The module reports the matched record without another start command. Keep the port open and view incoming bytes in HEX.
AA 09 0D 00 FF 00 00 02 4F 4E 0A
AA 0A 0D 00 FF 01 01 03 4F 46 46 0AIn these examples, the record field identifies 0 or 1; the final bytes encode ON or OFF. Unmatched speech may produce no recognition frame.
Arduino: hardware and build
The supplied examples use an UNO and SoftwareSerial on digital pins 2 and 3.
Download the official VoiceRecognitionV3 library. In the following example, its folder is named VR3lib. Copy the vr_sample_train example folder beside it. Install Arduino CLI and the Arduino AVR core for an UNO; another board needs its own core and FQBN. A Sensor Shield V07 is optional; direct four-wire connection is sufficient.
arduino-cli core update-index
arduino-cli core install arduino:avrarduino-cli compile -b arduino:avr:uno --library VR3lib vr_sample_trainarduino-cli upload -b arduino:avr:uno -p COM5 vr_sample_trainOpen the UNO serial port at 115200 bit/s in a terminal that can append a newline. The example initializes the module-facing port at 9600 bit/s. The UNO and VR3 share ground and 5 V power as shown above.
Arduino: train and use the examples
Text commands on this page are entered through the Arduino training sketch.
settings
sigtrain 0 ON
sigtrain 1 OFF
load 0 1For each sigtrain command, wait for Speak now and Speak again and say the intended command twice. Use record 0 for "On" and record 1 for "Off". After load 0 1, say either command and inspect the printed recognition result.
| Training-sketch command | Purpose |
|---|---|
| record 0 1 | Check whether records 0 and 1 are trained. |
| vr | Inspect the active recognizer. |
| getsig 0 | Read the label associated with record 0. |
| clear | Stop recognition and empty the active list. |
| help | Print the sketch's supported command list. |
Example selection
| Example | What it demonstrates |
|---|---|
| vr_sample_control_led | Uses trained records 0 and 1 to control the UNO LED. Prepare both records before running it. |
| vr_sample_bridge | Adds framing around HEX command/data text. For settings send 00; for clear send 31; for loading 0/1 send 30 00 01. |
| vr_sample_multi_cmd | Uses record 0 as an application-level switch between 0-6 and 0,7-12. Only one set is active at a time. |
| vr_sample_check_baud_rate | Helps find a previously changed module baud rate. |
UART frame format
All protocol numbers are HEX bytes unless a value is explicitly marked decimal.
| Field | Meaning |
|---|---|
| AA | Frame head. |
| LEN | Number of bytes in LEN + command + data. |
| Command | One command or event byte. |
| Data | Zero or more command-specific bytes. |
| 0A | Frame terminator at the position determined by LEN. |
LEN = 2 + p
TOTAL_BYTES = LEN + 2There is no checksum field in the documented frame. HEX-send mode converts each written pair, such as AA, into one byte. Sending the characters "AA" in ordinary text mode sends different bytes.
Receive by length, not by line endings
Find AA, read LEN, then collect LEN more bytes after the first two bytes. Verify that the last byte is 0A and that the command/data layout is valid. A serial read may contain part of a frame, one frame or several frames.
Command map and notation
Use one set of count-based symbols throughout the protocol reference.
| Code | Command family | Purpose |
|---|---|---|
| 00-03 | Queries | Settings, recognizer, training status and signature. |
| 10-15 | System settings | Restore, baud rate, output mode, pulse width, output reset and auto load. |
| 20-22 | Record operations | Train, train with signature and edit signature. |
| 30-32 | Recognizer and groups | Load, clear and group operations. |
| 0A / 0D / FF | Module-originated messages | Training prompt, recognition event and protocol error. |
| Symbol | Definition |
|---|---|
| m | Number of record IDs or record/status pairs in this frame; m is a count, not a last index. |
| k | Number of signature bytes. |
| t | Number of prompt bytes, including any CR byte included by the module. |
| R0...R(m-1) | Record IDs. Use 00-4F for the 80-record product range. |
| N | Count/status header described by the relevant command. Do not reuse one command's status meaning for another. |
| [expression] | The numeric value must be calculated and encoded as one HEX length byte. Brackets are not transmitted. |
For each command, count the data fields shown in the layout and calculate LEN before sending the frame.
Queries: settings and recognizer
00 reports settings; 01 reports the current active list.
AA 02 00 0A
AA 08 00 ST BR IOM PW AL GRP 0A| Field | Interpretation |
|---|---|
| ST | 00: successful settings-query response; not a record-training status. |
| BR | 00 or 03: 9600; 01: 2400; 02: 4800; 04: 19200; 05: 38400 bit/s. |
| IOM / PW | Output mode / pulse-width level. IOM: 00=Pulse, 01=Toggle, 02=Down/Clear, 03=Up/Set. |
| AL | Saved auto-load bitmap: 00 disables it; 01/03/07/.../7F select active list positions. Erased FF is disabled at boot. |
| GRP | Saved external control mode: 00=off, 01=system, 02=user. Restart to apply a saved change. |
AA 02 01 0A
AA 0D 01 RVN R0 R1 R2 R3 R4 R5 R6 RTN MAP GRPM 0A| Field | Interpretation |
|---|---|
| RVN | Number of valid active records, at most 7. |
| R0-R6 | Record ID occupying each slot; FF denotes an unused/unset slot. |
| RTN / MAP | Total listed records / valid-slot bitmap. Bit i of MAP corresponds to slot i. |
| GRPM | FF: non-group mode; 00-0A: system-group range; 80-87: user-group indication. |
Queries: training status and signature
02 checks stored voice templates; 03 reads a record's text label.
AA [2+m] 02 R0 ... R(m-1) 0A
AA 03 02 FF 0AAA [3+2*m] 02 N R0 STA0 ... R(m-1) STA(m-1) 0A| Status in a 02 record/status pair | Meaning |
|---|---|
| 00 | Untrained |
| 01 | Trained |
| FF | Record ID outside the supported range |
For a specified-record query, N counts trained records in that request. An all-record query returns five pairs per frame and N is cumulative across frames. To check the 80-record product range, query IDs 0-79 explicitly in small batches, such as five records.
AA 04 02 00 01 0AAA 03 03 R 0A
AA [4+k] 03 R k SIGNATURE 0AHere k is the number of signature bytes. The reply includes the record byte and signature-length byte, so LEN=4+k.
AA 03 03 00 0A
AA 06 03 00 02 4F 4E 0ACommand 21 stores at most 10 signature bytes and reports F0 on truncation. Command 22 accepts 0-9 bytes. Use short ASCII labels for predictable byte counts.
System settings: restore and baud rate
10 restores settings; 11 changes the module UART rate after restart.
AA 02 10 0A
AA 03 10 00 0AAA 03 11 BR 0A
AA 03 11 00 0A| BR (HEX) | Baud rate (bit/s) |
|---|---|
| 00 or 03 | 9600 |
| 01 | 2400 |
| 02 | 4800 |
| 04 | 19200 |
| 05 | 38400 |
AA 03 11 04 0AReceive the acknowledgement at the current baud rate. Restart VR3, then change the host to the selected rate and query settings again. If using an Arduino sketch, update the module-facing SoftwareSerial rate as well.
If the saved rate is unknown, try the supported rates using the read-only settings query. Change only the host rate while searching; do not send blind configuration commands.
GPIO configuration commands
12 selects output behavior; 13 selects pulse duration; 14 resets outputs.
AA 03 12 MODE 0A
AA 03 12 00 0A| MODE | Output behavior |
|---|---|
| 00 | Pulse: active-low pulse on recognition. |
| 01 | Flip / Toggle: alternate output state on each event. |
| 02 | Down / Clear: drive low on recognition; retain until reset. |
| 03 | Up / Set: drive high on recognition; retain until reset. |
AA 03 13 LEVEL 0A
AA 03 13 00 0A
AA [2+m] 14 IO0 ... IO(m-1) 0A
AA 03 14 00 0A| LEVEL -> width | LEVEL -> width | LEVEL -> width | LEVEL -> width |
|---|---|---|---|
| 00 -> 10 ms | 04 -> 30 ms | 08 -> 50 ms | 0C -> 300 ms |
| 01 -> 15 ms | 05 -> 35 ms | 09 -> 75 ms | 0D -> 400 ms |
| 02 -> 20 ms | 06 -> 40 ms | 0A -> 100 ms | 0E -> 500 ms |
| 03 -> 25 ms | 07 -> 45 ms | 0B -> 200 ms | 0F -> 1000 ms |
For 14, use output IDs 00-06, or a single FF to reset all outputs. Pulse-width levels range from 00 through 0F.
Understanding the output waveforms
Mode 02 is Down/Clear; mode 03 is Up/Set.
| Marker / mode | Meaning |
|---|---|
| A | Records are loaded; initial output state is shown schematically. |
| B / C / D | The associated recognition event occurs. |
| E | Host sends output reset. |
| Pulse | The output goes low briefly and returns high after the configured duration. |
| Toggle | Each event changes high to low or low to high. |
| Down / Clear | Recognition makes the output low; reset returns it to its initial high state. |
| Up / Set | Recognition makes the output high; reset returns it to its initial low state. |
AA 03 14 FF 0A
AA 03 14 01 0APower-on auto load
15 stores the record list to activate after the module starts.
AA [3+m] 15 BITMAP R0 ... R(m-1) 0A
AA [4+m] 15 00 BITMAP R0 ... R(m-1) 0A| Number of entries m | BITMAP (HEX) |
|---|---|
| 0 / disabled | 00 |
| 1 | 01 |
| 2 | 03 |
| 3 | 07 |
| 4 | 0F |
| 5 | 1F |
| 6 | 3F |
| 7 | 7F |
For a contiguous list of m entries, the bitmap is (1 << m) - 1. It describes list positions, not the record-ID value. Train the records first, then configure auto load.
AA 05 15 03 00 01 0A
AA 06 15 00 03 00 01 0AAA 03 15 00 0A
AA 04 15 00 00 0ARecord commands: train and label
20 records voice templates; 21 also assigns a signature; 22 edits a signature.
AA [2+m] 20 R0 ... R(m-1) 0A
AA [3+2*m] 20 N R0 STA0 ... R(m-1) STA(m-1) 0ADuring training, the module sends 0A prompt frames. N in the final result is described as the successful-training count. Use a one-record operation first so that prompt and result association is unambiguous.
AA [3+k] 21 R SIGNATURE 0A
AA [5+k] 21 N R STA SIGNATURE 0AAA [3+k] 22 R SIGNATURE 0A
AA 03 22 R 0AAA [4+k] 22 00 R SIGNATURE 0A
AA 04 22 00 R 0A| Final training result STA | Meaning |
|---|---|
| 00 | Trained successfully. |
| F0 | Command 21 trained successfully; signature truncated to 10 bytes. |
| FE | Training failed after the retry limit. |
| FF | Invalid record value. |
Recognizer commands: load and clear
30 activates trained records; 31 removes the current recognition list.
AA [2+m] 30 R0 ... R(m-1) 0A
AA [3+2*m] 30 N R0 STA0 ... R(m-1) STA(m-1) 0A| Load result | Meaning |
|---|---|
| 00 | Loaded successfully |
| FC | Record already in the active recognizer |
| FD | Recognizer full |
| FE | Record is not trained |
| FF | Record ID outside the supported range |
N is the number loaded successfully. A load operation begins recognition immediately. The active recognizer can hold at most seven valid records. If the old list is no longer wanted, clear it before loading a replacement.
AA 05 30 00 01 02 0A
AA 09 30 03 00 00 01 00 02 00 0AAA 02 31 0A
AA 03 31 00 0AClear stops recognition and empties the active list. It does not erase trained templates. The yellow LED flashes slowly during recognition and stays on after the recognizer is cleared.
Groups and external selection
A group is a record list, not another recognition engine.
System groups contain fixed consecutive ranges; user groups contain custom lists of up to seven records. Loading either group replaces the active recognition list. User groups are numbered 0-7.
| IN2 | IN1 | IN0 | Selected group (decimal) |
|---|---|---|---|
| LOW | LOW | LOW | 7 |
| LOW | LOW | HIGH | 6 |
| LOW | HIGH | LOW | 5 |
| LOW | HIGH | HIGH | 4 |
| HIGH | LOW | LOW | 3 |
| HIGH | LOW | HIGH | 2 |
| HIGH | HIGH | LOW | 1 |
| HIGH | HIGH | HIGH | 0 |
The product supports 80 records, IDs 0-79. System groups 00-0A cover complete seven-record sets through record 76. Load records 77-79 directly by record ID.
Group commands: configure
32 uses a subcommand byte; lengths include that byte.
AA 04 32 00 MODE 0A
AA 04 32 00 FF 0A| MODE | Saved configuration |
|---|---|
| 00 | Disable external group control |
| 01 | System-group selection by inputs |
| 02 | User-group selection by inputs; see the integration note below |
| FF | Query only |
AA 03 32 00 0A
AA 05 32 00 FF MODE 0AThe command saves the mode to Flash; restart to apply it. Verify external pin-based user-group selection on the target module before integration. For the initial user-group test, use UART command 32/03.
AA [4+m] 32 01 GID R0 ... R(m-1) 0A
AA 04 32 01 GID 0AAA 07 32 01 00 00 07 19 0A25 is decimal here; its HEX record byte is 19. A successful configuration is acknowledged with AA 03 32 00 0A. Editing a group describes its contents; use a load-group command to activate it.
Group commands: load and inspect
Use a loaded-list response to verify which records became active.
AA 04 32 02 GID 0A
AA 04 32 03 GID 0AAA 0D 32 GID R0 R1 R2 R3 R4 R5 R6 RTN MAP GRPM 0AGID is the loaded group ID; R0-R6 are the listed records; RTN, MAP and GRPM describe the list. Both system-group and user-group load replies use this layout and LEN=0D.
AA 03 32 04 0A
AA 04 32 04 GID 0AAA 0A 32 GID R0 R1 R2 R3 R4 R5 R6 0AA query for all groups can return several frames. Associate each frame with its group ID. FF denotes an unset group entry; do not use an untrained or unset record as a recognition template.
AA 04 32 04 00 0A
AA 04 32 03 00 0AModule-originated messages
Training prompts, recognition events and protocol errors can arrive asynchronously.
AA [3+t] 0A R PROMPT 0APrompt text includes Speak now, Speak again and Success. A prompt may include a CR byte before the final terminator. Read the length and treat the prompt as bytes. Its length depends on the text; the command byte 0A is separate from the final frame terminator.
AA [7+k] 0D 00 GRPM R RI k SIGNATURE 0AGRPM is FF outside group mode. R is the trained record ID, RI is its active slot and k is the signature length. If k=0, no signature bytes follow. The fixed byte after command 0D is 00.
AA 03 FF ECODE 0A| ECODE | Meaning |
|---|---|
| FF | Undefined command |
| FE | Command length error |
| FD | Invalid data |
| FC | Invalid subcommand |
| FB | Command usage error |
Log the complete frame when an error occurs. Error-frame ECODE and training-result STA belong to different commands; the same byte value need not have the same meaning.
Troubleshooting and validation
Work from electrical checks to communication, training, loading and recognition.
| Symptom | What to check |
|---|---|
| No serial port | USB data cable, adapter connection and driver installation. Identify the actual port rather than assuming COM5. |
| No settings reply | Power, common ground, crossed TX/RX, compatible TTL level, correct port, HEX mode and complete frame. |
| Unreadable receive text | Protocol bytes are binary. Use HEX view; only the prompt/signature portions are readable text. Verify baud rate. |
| Training fails | Microphone plugged into VR3, correct timing, quiet environment, stable speech and a command shorter than 1.5 s. |
| Trained but not recognized | Query training status, inspect the active list and the load results. Test using the person who trained the record. |
| Wrong command / false trigger | Use more distinct words; retrain at a representative speaking distance and noise level. |
| Works until power is removed | Verify saved training status, baud rate and auto-load settings after restart. Reload records if required. |
| Unexpected GPIO behavior | Check the selected mode (02=Down/Clear, 03=Up/Set), output/slot mapping, wiring and reset sequence. |
A practical acceptance check
Test both commands at least ten times each and record correct matches, missed matches and wrong matches. Repeat in the intended environment. Use the results to assess your application; this check does not establish the ideal-condition accuracy specification.
Also test power cycling, a deliberately untrained record, an already-loaded record, switching between record lists, and malformed-frame recovery in your own host driver. Save raw HEX logs together with the hardware/firmware identification.
Revision History
Document revisions describe changes to this manual, not a hardware or firmware version.
| Rev. | Date | Changes |
|---|---|---|
| R4 | 15 Oct 2026 | Moved change descriptions to this final chapter. Rewrote the main text as current operating instructions. Kept source-review details in the separate Chinese review. No change to R3 protocol definitions or the 80-record capacity. |
| R3 | 15 Oct 2026 | Aligned the protocol with the confirmed production firmware: GPIO 02=Down/Clear and 03=Up/Set; final training results FE/FF and signature-truncation result F0; active-low group inputs; clarified settings, counts and output-slot mapping. Capacity remains 80 records. |
| R2 | 15 Oct 2026 | Interim clarification of product capacity and legacy protocol descriptions. Protocol assignments in this edition were superseded by R3. |
| R1 | 15 Oct 2026 | Rewrote the English manual, separated the direct PC and Arduino routes, added ten explanatory diagrams, and standardized terminology and frame-length notation. |
Related documents
The original ELECHOUSE VR3 manual provides the earlier product documentation. The official Arduino library contains host-side examples; Arduino CLI documentation explains the build tool.
The separate Chinese review records source comparisons, protocol corrections, source-file hashes and validation limits. It is an editorial and engineering reference for maintaining this manual.