<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: maruhana</title>
    <description>The latest articles on DEV Community by maruhana (@maruhana).</description>
    <link>https://dev.to/maruhana</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4233335%2F6f7f565f-5b9e-45fb-a66c-3714f5180eb2.png</url>
      <title>DEV Community: maruhana</title>
      <link>https://dev.to/maruhana</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/maruhana"/>
    <language>en</language>
    <item>
      <title>Rokid Glasses Can Record 4 Microphone Channels, But Only If You Ask for Exactly 4</title>
      <dc:creator>maruhana</dc:creator>
      <pubDate>Sun, 08 Nov 2026 08:56:37 +0000</pubDate>
      <link>https://dev.to/maruhana/rokid-glasses-can-record-4-microphone-channels-but-only-if-you-ask-for-exactly-4-3106</link>
      <guid>https://dev.to/maruhana/rokid-glasses-can-record-4-microphone-channels-but-only-if-you-ask-for-exactly-4-3106</guid>
      <description>&lt;p&gt;&lt;em&gt;Measured on a real RV101: which channel carries your voice, which carry the room, and the claims I had to take back.&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This is an English adaptation of an article I originally published in Japanese on Zenn: &lt;a href="https://zenn.dev/maruhana/articles/rokid-glasses-mic-4ch-audiosource" rel="noopener noreferrer"&gt;Rokid Glasses のマイクは 4ch で使える&lt;/a&gt;. The measurements and conclusions are mine; I used an AI tool to help translate and restructure the text, and I checked the numbers against the original.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Scope first
&lt;/h2&gt;

&lt;p&gt;This article is about recording audio &lt;strong&gt;on the glasses themselves&lt;/strong&gt;: an Android app running on the Rokid Glasses (RV101, YodaOS-Sprite / Android) and opening &lt;code&gt;AudioRecord&lt;/code&gt; directly. It is &lt;strong&gt;not&lt;/strong&gt; about the phone-side CXR-M SDK, which documents its own near-field / far-field / panoramic pickup modes. The two are easy to mix up; nothing below applies to the phone SDK.&lt;/p&gt;

&lt;p&gt;Everything here was measured on &lt;strong&gt;one unit&lt;/strong&gt;, on firmware &lt;strong&gt;1.25.012&lt;/strong&gt;. I later re-checked the structure on 1.25.015, 1.26.011, 1.27.009 and 1.28.016 (details at the end). Treat this as a measurement log of one device, not as a specification.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;An app on the glasses can get &lt;strong&gt;4 distinct microphone channels&lt;/strong&gt;, but only when it requests &lt;strong&gt;exactly 4&lt;/strong&gt;. With &lt;code&gt;MIC&lt;/code&gt;, asking for 1, 2, 3, 6 or 8 channels gives you copies of a single stream (plus zero-filled channels).&lt;/li&gt;
&lt;li&gt;What each of the 4 channels contains &lt;strong&gt;depends on the &lt;code&gt;AudioSource&lt;/code&gt;&lt;/strong&gt;. With &lt;code&gt;UNPROCESSED&lt;/code&gt;: a voice-heavy stream, a copy of it, and 2 room-sound streams. With &lt;code&gt;MIC&lt;/code&gt;: one processed stream that keeps your voice and suppresses the room, plus 3 room-sound streams.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;VOICE_RECOGNITION&lt;/code&gt; opens without error but returns &lt;strong&gt;all zeros&lt;/strong&gt; on this device, no matter how many channels you request.&lt;/li&gt;
&lt;li&gt;Opening a second &lt;code&gt;AudioRecord&lt;/code&gt; in the same app stops the first one (&lt;code&gt;read&lt;/code&gt; returns &lt;code&gt;-6&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Measure your own unit before relying on any of this.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. Requesting 4 channels
&lt;/h2&gt;

&lt;p&gt;This started with a report I saw on X (paraphrased; the report counts channels from 1, while this article counts from ch0): "Rokid Glasses can record 4 channels", "channels 1 and 2 are the same data", "channels 3 and 4 are in phase", "channels 1 and 2 are DSP-processed", "maybe it's the pickup-mode switch in the translation app". That contradicted something I had written earlier in my series: that apps can use &lt;strong&gt;2&lt;/strong&gt; microphones.&lt;/p&gt;

&lt;p&gt;The reason for the contradiction was quick to find. My earlier claim was based on &lt;code&gt;getMicrophones()&lt;/code&gt; returning two built-in microphones with different hardware ids, and on logs from a session opened as a single channel (equivalent to &lt;code&gt;CHANNEL_IN_MONO&lt;/code&gt;). Every configuration I had tried was 1 or 2 channels. I had only asked for 2, so I only got 2. I never tried the configurations I hadn't asked for.&lt;/p&gt;

&lt;p&gt;You can't express 4 or more channels cleanly with position masks (&lt;code&gt;CHANNEL_IN_MONO&lt;/code&gt; / &lt;code&gt;CHANNEL_IN_STEREO&lt;/code&gt;). A channel &lt;strong&gt;index mask&lt;/strong&gt; lets you request the count directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;AudioFormat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Builder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setEncoding&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;AudioFormat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ENCODING_PCM_16BIT&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setSampleRate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;48000&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setChannelIndexMask&lt;/span&gt;&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;// request exactly 4 channels&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two pitfalls:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;AudioRecord.getMinBufferSize()&lt;/code&gt; does not accept an index mask. It only accepts the mono/stereo position masks and returns &lt;code&gt;ERROR_BAD_VALUE&lt;/code&gt; for anything else. Size the buffer yourself. My test app used half a second: &lt;code&gt;ch × rate × 2 / 2&lt;/code&gt; bytes.&lt;/li&gt;
&lt;li&gt;If you compute the recording size in milliseconds as &lt;code&gt;ch × rate × 2 × ms&lt;/code&gt;, then 48 kHz × 8 ch × 3,000 ms overflows &lt;code&gt;int&lt;/code&gt; and the app crashes with &lt;code&gt;NegativeArraySizeException&lt;/code&gt;. In my first sweep, 48 kHz / 8 ch was the only configuration that crashed, for this reason. Use &lt;code&gt;long&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I tested by brute force: &lt;strong&gt;4 sources × 2 sample rates × 6 channel counts&lt;/strong&gt; (&lt;code&gt;MIC&lt;/code&gt; / &lt;code&gt;UNPROCESSED&lt;/code&gt; / &lt;code&gt;VOICE_RECOGNITION&lt;/code&gt; / &lt;code&gt;CAMCORDER&lt;/code&gt;, 16 kHz / 48 kHz, 1/2/3/4/6/8 channels). Each configuration was opened in turn, recorded for 3 seconds, and saved with the configuration in the file name. Checking whether a configuration &lt;em&gt;opens&lt;/em&gt; is not enough: some configurations initialize successfully and then return all zeros, so I read the data and computed the RMS of every channel. The test app is called &lt;code&gt;jp.example.micprobe&lt;/code&gt; here as an example name.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. What the sweep showed
&lt;/h2&gt;

&lt;p&gt;RMS per channel in dBFS, quiet room, 48 kHz, 4 channels requested:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;4ch&lt;/th&gt;
&lt;th&gt;ch0 / ch1 / ch2 / ch3&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MIC&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;−91.4&lt;/strong&gt; / −74.4 / −73.2 / −75.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;UNPROCESSED&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;−84.3 / −84.3 / −83.6 / −83.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CAMCORDER&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;−86.5&lt;/strong&gt; / −72.8 / −72.0 / −73.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;VOICE_RECOGNITION&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;opens, but&lt;/td&gt;
&lt;td&gt;zero / zero / zero / zero&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;With &lt;code&gt;MIC&lt;/code&gt; and &lt;code&gt;CAMCORDER&lt;/code&gt;, only ch0 is 14–17 dB lower; with &lt;code&gt;UNPROCESSED&lt;/code&gt; all four are level. &lt;code&gt;VOICE_RECOGNITION&lt;/code&gt; stays all-zero however many channels you request. If you record from your own app on this device, use &lt;code&gt;MIC&lt;/code&gt; or &lt;code&gt;UNPROCESSED&lt;/code&gt;. (The built-in features open the microphones a different way; see section 9.)&lt;/p&gt;

&lt;p&gt;The important part: &lt;strong&gt;you only get 4 real channels when you request exactly 4.&lt;/strong&gt; Counting how many &lt;em&gt;distinct&lt;/em&gt; streams actually come back for each requested channel count (8 ch measured at 16 kHz, the rest at 48 kHz; &lt;code&gt;CAMCORDER&lt;/code&gt; behaves like &lt;code&gt;MIC&lt;/code&gt;):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Requested&lt;/th&gt;
&lt;th&gt;Non-zero channels&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;MIC&lt;/code&gt;: distinct streams&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;UNPROCESSED&lt;/code&gt;: distinct streams&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1 ch&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2 ch&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1 (duplicate of the same data)&lt;/td&gt;
&lt;td&gt;2 (separate; content not checked)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3 ch&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1 (+1 zero)&lt;/td&gt;
&lt;td&gt;2 (+1 zero)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4 ch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;4&lt;/strong&gt; (the only case with 4)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;3&lt;/strong&gt; (ch0 = copy of ch1, + 2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6 ch&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1 (+4 zero)&lt;/td&gt;
&lt;td&gt;2 (+4 zero)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8 ch&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1 (+6 zero)&lt;/td&gt;
&lt;td&gt;2 (+6 zero)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;With &lt;code&gt;MIC&lt;/code&gt; at 2 channels, &lt;code&gt;ch0 == ch1&lt;/code&gt; is a bit-exact match (correlation +1.0000, lag 0): the same single stream in two slots. In other words, &lt;strong&gt;the number of microphones returned by &lt;code&gt;getMicrophones()&lt;/code&gt; is not a cap on the channel count.&lt;/strong&gt; With &lt;code&gt;MIC&lt;/code&gt; and &lt;code&gt;CAMCORDER&lt;/code&gt;, you cannot get the room-side streams unless you request exactly 4. With &lt;code&gt;UNPROCESSED&lt;/code&gt;, 2 channels already gives two different streams, but I did not check whether those two are voice-side or room-side.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Sine tones: what is ch0?
&lt;/h2&gt;

&lt;p&gt;I played 500 / 1000 / 2000 / 4000 Hz tones from a PC speaker, recorded 4 channels, and measured the phase difference and amplitude ratio between channels from the FFT. (Why a PC speaker and not the glasses' own speaker: see section 10.)&lt;/p&gt;

&lt;p&gt;Amplitude of ch0, relative to the channel that picked up each frequency best:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Frequency&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;MIC&lt;/code&gt; ch0&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;UNPROCESSED&lt;/code&gt; ch0&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;500 Hz&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;−98.2 dB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;−7.3 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1000 Hz&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;−98.1 dB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;−2.4 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2000 Hz&lt;/td&gt;
&lt;td&gt;−28.8 dB&lt;/td&gt;
&lt;td&gt;−6.1 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4000 Hz&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;−72.1 dB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;−4.2 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Same microphones, same sound, same 4-channel request. &lt;strong&gt;Changing only the &lt;code&gt;AudioSource&lt;/code&gt; changes ch0 by more than 90 dB at most.&lt;/strong&gt; The &lt;code&gt;MIC&lt;/code&gt; / &lt;code&gt;CAMCORDER&lt;/code&gt; ch0 is a DSP-processed channel (which is also why it produces stretches of exact digital zero in a quiet room).&lt;/p&gt;

&lt;p&gt;ch1–ch3, on the other hand, line up in phase even though the two sources were recorded separately. The phase difference of ch3, expressed as a distance:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Frequency&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;MIC&lt;/code&gt; ch3&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;UNPROCESSED&lt;/code&gt; ch3&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2000 Hz&lt;/td&gt;
&lt;td&gt;−42.3 mm&lt;/td&gt;
&lt;td&gt;−42.6 mm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4000 Hz&lt;/td&gt;
&lt;td&gt;−30.5 mm&lt;/td&gt;
&lt;td&gt;−30.6 mm&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;So ch1–ch3 carry the same microphone signals under both sources; only ch0 is swapped. With &lt;code&gt;UNPROCESSED&lt;/code&gt;, the amplitude ratio and phase of &lt;strong&gt;ch0 and ch1 matched to the decimal at every frequency&lt;/strong&gt;, consistent with the bit-exact match. &lt;strong&gt;With &lt;code&gt;UNPROCESSED&lt;/code&gt;, the slot that holds the processed stream under &lt;code&gt;MIC&lt;/code&gt; holds a copy of ch1 instead.&lt;/strong&gt; (Whether that ch1 is truly unprocessed, I did not verify; see section 5.)&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Wearing the glasses and talking
&lt;/h2&gt;

&lt;p&gt;Next I wore the glasses and recorded 4 channels for 60 seconds: silent for the first 28 seconds, talking for the last 30. No speaker playback, just my own voice.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;ch0&lt;/th&gt;
&lt;th&gt;ch1&lt;/th&gt;
&lt;th&gt;ch2&lt;/th&gt;
&lt;th&gt;ch3&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;MIC&lt;/code&gt; silent&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;−104&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;−77.6&lt;/td&gt;
&lt;td&gt;−77.3&lt;/td&gt;
&lt;td&gt;−77.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;MIC&lt;/code&gt; talking&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;−33&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;−46.5&lt;/td&gt;
&lt;td&gt;−45.1&lt;/td&gt;
&lt;td&gt;−43.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;MIC&lt;/code&gt; rise&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+71 dB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;+31&lt;/td&gt;
&lt;td&gt;+32&lt;/td&gt;
&lt;td&gt;+34&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;UNPROC&lt;/code&gt; silent&lt;/td&gt;
&lt;td&gt;−83.7&lt;/td&gt;
&lt;td&gt;−83.7&lt;/td&gt;
&lt;td&gt;−83.1&lt;/td&gt;
&lt;td&gt;−82.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;UNPROC&lt;/code&gt; talking&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;−40&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;−40&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;−53&lt;/td&gt;
&lt;td&gt;−52&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;UNPROC&lt;/code&gt; rise&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+44 dB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;+44&lt;/td&gt;
&lt;td&gt;+30&lt;/td&gt;
&lt;td&gt;+31&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Only &lt;code&gt;MIC&lt;/code&gt; ch0 flips position: about 27 dB &lt;em&gt;below&lt;/em&gt; the others when I'm silent, 10–13 dB &lt;em&gt;above&lt;/em&gt; them when I talk. Comparing the rise, the contrast between voice and room sound improves by about 40 dB.&lt;/p&gt;

&lt;p&gt;Correlation coefficients during speech show what each slot holds:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;ch0-ch1&lt;/th&gt;
&lt;th&gt;ch1-ch2&lt;/th&gt;
&lt;th&gt;ch1-ch3&lt;/th&gt;
&lt;th&gt;ch2-ch3&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;UNPROCESSED&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+1.000&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;+0.436&lt;/td&gt;
&lt;td&gt;+0.469&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+0.981&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MIC&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;−0.109&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+0.990&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+0.954&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;+0.979&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Under &lt;code&gt;UNPROCESSED&lt;/code&gt;, the voice-side pair (ch0 = ch1) correlates with the room-side channels at about 0.44. Under &lt;code&gt;MIC&lt;/code&gt;, ch1 correlates with ch2/ch3 at 0.95–0.99. Same "4 channels", different meaning per slot depending on the &lt;code&gt;AudioSource&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UNPROCESSED : ch0 = ch1 = voice-side (bit-identical copy)   ch2, ch3 = room-side (2)
MIC         : ch0 = processed (uncorrelated with all)        ch1, ch2, ch3 = room-side (3)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcispi5hgw6m0w5gvaq4m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcispi5hgw6m0w5gvaq4m.png" alt="What goes into each of the four channel slots under UNPROCESSED and under MIC" width="800" height="387"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure (labels in Japanese): the four slots ch0–ch3 for each source. UNPROCESSED: ch0 and ch1 hold the same voice-side data (ch1 is a copy of ch0), ch2 and ch3 hold room sound. MIC: ch0 holds the voice-side stream with suppression applied, ch1–ch3 hold room sound. "Voice-side" and "room-side" are my labels.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note on the labels:&lt;/strong&gt; "voice-side" and "room-side" are my own names. They do &lt;strong&gt;not&lt;/strong&gt; describe a confirmed physical microphone layout. As the next sections explain, I could not determine the physical layout.&lt;/p&gt;

&lt;p&gt;When I first saw this, I started writing "the hardware is 1 voice mic + 3 room mics". That goes too far. A correlation of 0.99 can come from separate physical elements or from the same element with different processing, and the number of room-side streams doesn't even agree between sources (2 under &lt;code&gt;UNPROCESSED&lt;/code&gt;, 3 under &lt;code&gt;MIC&lt;/code&gt;). What I can say is: &lt;strong&gt;under &lt;code&gt;MIC&lt;/code&gt;, the 4 channels are one processed stream plus three mutually distinct streams.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  5. Spectral ratio, and the explanation I withdrew
&lt;/h2&gt;

&lt;p&gt;I computed the spectral ratio of the voice-side channel (ch0) to a room-side channel (ch2), separately for speech and silence. Values in dB:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Band&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;UNPROC&lt;/code&gt; speech&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;UNPROC&lt;/code&gt; silence&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;MIC&lt;/code&gt; speech&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;MIC&lt;/code&gt; silence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;100–300 Hz&lt;/td&gt;
&lt;td&gt;+12.8&lt;/td&gt;
&lt;td&gt;−0.6&lt;/td&gt;
&lt;td&gt;+12.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;−24.0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;600–1200 Hz&lt;/td&gt;
&lt;td&gt;+11.9&lt;/td&gt;
&lt;td&gt;−0.4&lt;/td&gt;
&lt;td&gt;+11.9&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;−20.5&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2400–4800 Hz&lt;/td&gt;
&lt;td&gt;+12.1&lt;/td&gt;
&lt;td&gt;−0.6&lt;/td&gt;
&lt;td&gt;+11.7&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;−16.4&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4800–9600 Hz&lt;/td&gt;
&lt;td&gt;+11.3&lt;/td&gt;
&lt;td&gt;+0.3&lt;/td&gt;
&lt;td&gt;+11.7&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;−15.9&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp6hih37nss7a0sje7yjj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp6hih37nss7a0sje7yjj.png" alt="Level difference between ch0 and ch2 per frequency band" width="799" height="413"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure (labels in Japanese): bar chart of the ch0 ÷ ch2 level difference per band. During speech, both UNPROCESSED and MIC are about +12 dB across all bands. During silence, UNPROCESSED is about 0 dB and MIC is about −18 to −25 dB. The chart was recomputed from raw data and differs from the table by a few dB.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The ch0–ch2 delay during speech was also essentially zero across bands (split into three bands from 300 to 8000 Hz, all within 1 cm). Three things can be read from this: in silence, all bands are within ±1 dB (ch0 is as sensitive to the room as the room-side channels); during speech, a flat +12 dB across all bands (no frequency dependence, so neither a low-frequency-heavy bone-conduction path nor a high-frequency-heavy acoustic horn); and zero delay.&lt;/p&gt;

&lt;p&gt;At this point I once wrote: "the +12 dB comes from physics (directional placement), so a dedicated mouth-facing microphone physically exists." &lt;strong&gt;I withdrew that.&lt;/strong&gt; The same observations can be explained by beamforming output synthesized from 8 channels: a directional synthesis also boosts only the nearby voice, averages out room sound, and shows no delay if everything is time-aligned within one stream. And the guarantee that &lt;code&gt;UNPROCESSED&lt;/code&gt; is truly unprocessed is Android's intent, not something I verified this ROM honors. So I cannot tell whether the +12 dB comes from physical placement or from synthesis.&lt;/p&gt;

&lt;p&gt;What I &lt;em&gt;can&lt;/em&gt; say is limited to this: &lt;strong&gt;what &lt;code&gt;MIC&lt;/code&gt; adds is suppression&lt;/strong&gt; (it drops ch0 by 16–24 dB during silence). The +12 dB voice emphasis is already present under &lt;code&gt;UNPROCESSED&lt;/code&gt;. Combined, the per-band level difference gives about 32 dB of contrast improvement. (The "about 40 dB" in section 4 comes from the RMS rise, a different calculation.)&lt;/p&gt;
&lt;h2&gt;
  
  
  6. Other hypotheses I withdrew, and what survived
&lt;/h2&gt;

&lt;p&gt;To estimate the physical layout, I went as far as chirps (200→8000 Hz sweeps ×3), ESS impulse responses, and direct-sound detection (first point above 35% of the peak). The values changed from measurement to measurement (ch0–ch3 went from −26.7 mm to +70.3 mm). Reverberation dominates, and a single sine or chirp can't give you the physical layout. &lt;strong&gt;Withdrawn.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For the same reason, I withdrew "ch2 and ch3 have different frequency responses" (the 4–8 kHz difference changed from −4.1 dB to +0.6 dB, which room position explains). The X report's "channels 1 and 3 have different acoustic characteristics / channels 3 and 4 are the same" (counted from 1) is something my measurements could neither confirm nor rule out.&lt;/p&gt;

&lt;p&gt;The only thing that survived is &lt;code&gt;ch0 == ch1&lt;/code&gt;. It reproduces every time at &lt;strong&gt;+0.00 samples, spread 0.00&lt;/strong&gt;. It's data identity, not acoustics, so the room doesn't affect it.&lt;/p&gt;
&lt;h2&gt;
  
  
  7. Physical vs. synthesized can't be decided from outside
&lt;/h2&gt;

&lt;p&gt;On reflection, this was never a measurement-technique problem. &lt;strong&gt;A physical directional microphone and linear beamforming are both linear, time-invariant, and direction-dependent.&lt;/strong&gt; A linearity test (vary the input level and check whether the ratio stays constant) can tell you whether non-linear processing (suppression, AGC) is present, but it cannot separate "a single directional element" from "a linear synthesis".&lt;/p&gt;

&lt;p&gt;There is weak circumstantial evidence. Beamforming usually loses directivity at low frequencies, where the wavelength is longer than the element spacing. Yet the measured boost is +12.8 dB even at 100–300 Hz and flat from 100 Hz to 9.6 kHz. That leans toward a single directional element, but adaptive beamforming can create directivity at low frequencies too, so it is not decisive. I'm closing this line of inquiry here.&lt;/p&gt;
&lt;h2&gt;
  
  
  8. Opening two recordings in one app: the later one wins
&lt;/h2&gt;

&lt;p&gt;While trying to separate these, I opened &lt;code&gt;MIC&lt;/code&gt; and &lt;code&gt;UNPROCESSED&lt;/code&gt; at the same time in the same app. The result was symmetric:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Open MIC first          -&amp;gt; MIC returns -6 on read and stops; UNPROCESSED is used
Open UNPROCESSED first  -&amp;gt; UNPROCESSED returns -6 and stops; MIC is used
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;-6&lt;/code&gt; is &lt;code&gt;ERROR_DEAD_OBJECT&lt;/code&gt;. Both sessions report &lt;code&gt;STATE_INITIALIZED&lt;/code&gt;, but opening the second one stops the first.&lt;/p&gt;

&lt;p&gt;This is &lt;strong&gt;a different situation&lt;/strong&gt; from another thing I checked: my recording kept running while the built-in AI assistant was active (worn, one A/B trial each way). That was coexistence &lt;strong&gt;across processes&lt;/strong&gt; with a system service (uid 1000). This section is about &lt;strong&gt;two recordings inside your own app&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. The official apps open 8 channels
&lt;/h2&gt;

&lt;p&gt;I switched the pickup scenes in the translation feature (Hi Rokid) and looked at how the recording session was opened, via the &lt;code&gt;openAudioRecord2&lt;/code&gt; log line. Its &lt;code&gt;mode&lt;/code&gt; changes per scene:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pickup scene&lt;/th&gt;
&lt;th&gt;&lt;code&gt;mode&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;channelMask&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;denoiseMode&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Lecture / movie&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;0x6000fc&lt;/code&gt; (8 channels)&lt;/td&gt;
&lt;td&gt;−1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Face-to-face conversation&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;0x6000fc&lt;/code&gt; (8 channels)&lt;/td&gt;
&lt;td&gt;−1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phone audio&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;0x10&lt;/code&gt; (1 channel, &lt;code&gt;inputSource 500&lt;/code&gt;) *&lt;/td&gt;
&lt;td&gt;−1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;(reference) Built-in AI&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;0x6000fc&lt;/code&gt; (8 channels)&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;* The phone-audio row was measured on firmware 1.27.009 (same in all 4 trials). On 1.25.012 it was &lt;code&gt;0x6000fc&lt;/code&gt; (8 channels).&lt;/p&gt;

&lt;p&gt;For the scenes that use the microphones (lecture/movie, face-to-face) and for the built-in AI, &lt;code&gt;channelMask&lt;/code&gt; is &lt;code&gt;0x6000fc&lt;/code&gt; (8 bits set), and switching scenes does not change the channel count; only &lt;code&gt;mode&lt;/code&gt; changes. The &lt;code&gt;intent&lt;/code&gt; is &lt;code&gt;trans_ali&lt;/code&gt; for translation and &lt;code&gt;AI_assistant&lt;/code&gt; for the built-in AI. Only the built-in AI uses suppression (&lt;code&gt;denoiseMode 2&lt;/code&gt;). On 1.27.009, the phone-audio scene (translating audio playing on the phone) did not use the glasses' microphones; it opened 1 channel from an input that is not a standard &lt;code&gt;AudioSource&lt;/code&gt; (&lt;code&gt;inputSource 500&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;What is observation and what is not:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Inference:&lt;/strong&gt; that &lt;code&gt;mode&lt;/code&gt; corresponds to the pickup scene. The log doesn't say what &lt;code&gt;mode&lt;/code&gt; means.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inference:&lt;/strong&gt; that &lt;code&gt;inputSource 500&lt;/code&gt; is audio coming from the phone. I did not check what &lt;code&gt;500&lt;/code&gt; is.&lt;/li&gt;
&lt;li&gt;I captured each scene &lt;strong&gt;only once&lt;/strong&gt;; reproducibility is unconfirmed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Capture notes: &lt;code&gt;openAudioRecord2&lt;/code&gt; is logged only once, when a recording session starts, so you have to &lt;strong&gt;reopen&lt;/strong&gt; the translation feature (clearing the log while it's open shows nothing). Translation does not appear in &lt;code&gt;dumpsys audio&lt;/code&gt;. A scene change made on the phone sometimes doesn't reach the glasses immediately (check the indicator at the bottom of the display).&lt;/p&gt;

&lt;p&gt;So, when the built-in translation and AI assistant use the microphones, they handle 8 channels through their own way of opening the device. From an app, the most I could get as separate streams was 4.&lt;/p&gt;

&lt;p&gt;This ties back to section 7: since the built-in AI uses 8 channels, it is if anything &lt;em&gt;more&lt;/em&gt; plausible that the 4 channels an app receives are synthesized from those 8. That is exactly why "physical or synthesized" is hard to decide from outside.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Measurement traps
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Don't rely on synchronization.&lt;/strong&gt; The recording start and playback start were measured 4 seconds apart. Make the analysis side search for where the tone is.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't &lt;code&gt;adb pull&lt;/code&gt; before the recording finishes.&lt;/strong&gt; You'll grab the previous file. I nearly drew a wrong conclusion this way once.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sound played from the glasses' own speaker does not reach the recording.&lt;/strong&gt; I assume the echo canceller (AEC) removes it, but I have no direct evidence. Using a PC speaker as the sound source turned out to be necessary, not just convenient.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  11. If you're implementing this
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;If you want the room-side streams reliably, request exactly 4 channels.&lt;/strong&gt; Under &lt;code&gt;MIC&lt;/code&gt; / &lt;code&gt;CAMCORDER&lt;/code&gt;, 1/2/3/6/8 channels collapse to copies of one stream. Under &lt;code&gt;UNPROCESSED&lt;/code&gt;, 2/3/6/8 channels give two separate streams, but I haven't checked what they contain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The &lt;code&gt;AudioSource&lt;/code&gt; changes what each channel means.&lt;/strong&gt; For just your own voice, &lt;code&gt;MIC&lt;/code&gt; ch0 (processed). For room sound, &lt;code&gt;UNPROCESSED&lt;/code&gt; ch2/ch3.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open one recording at a time per app.&lt;/strong&gt; Opening a second one stops the first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Above all, measure your own unit before relying on this.&lt;/strong&gt; Source/channel assignments can change with firmware and model, and every number here comes from one device on the firmware of the time.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Firmware notes
&lt;/h2&gt;

&lt;p&gt;All measurements in the body were taken on my unit on firmware &lt;strong&gt;1.25.012&lt;/strong&gt;, and results may differ in your environment.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1.25.015:&lt;/strong&gt; re-ran only the sweep. The structure was unchanged: 4 distinct streams only with a 4-channel request, &lt;code&gt;ch0 == ch1&lt;/code&gt;, &lt;code&gt;VOICE_RECOGNITION&lt;/code&gt; all zero. (Absolute RMS values move with room noise, so the numbers above are from the original measurement.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1.26.011:&lt;/strong&gt; checked only that &lt;code&gt;VOICE_RECOGNITION&lt;/code&gt; is still all zero.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1.27.009 and 1.28.016:&lt;/strong&gt; the 4-channel slot layout, the number of streams per requested channel count, and the two-recordings behavior were the same. Room-dependent values such as ch0 during silence differed by several to a dozen-plus dB. Only the phone-audio row in section 9 changed, on 1.27.009, so that table shows the 1.27.009 value. On 1.28.016 I did not measure the talk/silence comparison (section 4) or how the official apps open the microphones (section 9).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  About this series
&lt;/h2&gt;

&lt;p&gt;This is part of my Japanese-language series on building my own apps for the Rokid Glasses (RV101): setup, a conversation-support app, input handling, and audio. The original article and the rest of the series are on Zenn: &lt;a href="https://zenn.dev/maruhana/articles/rokid-glasses-mic-4ch-audiosource" rel="noopener noreferrer"&gt;Rokid Glasses のマイクは 4ch で使える（original, Japanese）&lt;/a&gt;. There is also a free Zenn book (Japanese) that walks through getting your own app running on the RV101 from scratch: &lt;a href="https://zenn.dev/maruhana/books/rokid-glasses-rv101-app-from-zero" rel="noopener noreferrer"&gt;Rokid Glasses（RV101）を買ってから、自分のアプリが動くまで&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>android</category>
      <category>java</category>
      <category>audio</category>
      <category>smartglasses</category>
    </item>
  </channel>
</rss>
