Skip to content

[Feature] 【安卓平板mic重定向到Linux实现语音识别写网文】关于mic重定向的一个方法,可以在虚拟机里面实现麦克风的支持 #462

@ChaserSu

Description

@ChaserSu

必须说明使用场景和价值

我基于这个项目,利用scrcpy的mic重定向,将CapsWriter-Offline装到这个软件里面了,实现了用任意安卓平板用语音写小说,当做MacBook air m1来使用:

https://github.com/ChaserSu/CapsWriter-Offline-Android

关于mic重定向,我是这么做的:

一、环境准备

  • 安卓设备:Android 11+(本案例为 Android 16)

二、编译安装 scrcpy(适配 arm64,含 Java 依赖)

scrcpy 服务端基于 Java 开发,编译时必须安装 JDK,否则会报错 “无法构建 scrcpy-server”,完整步骤如下:
稍晚一些时候,我会上传预编译或将这个组件集成到软件里

# 1. 安装编译依赖(含openjdk-17-jdk,scrcpy编译必需)
sudo apt update && sudo apt install -y \
  git gcc make meson ninja-build \
  libusb-1.0-0-dev ffmpeg \
  libavcodec-dev libavformat-dev libavutil-dev libsdl2-dev \
  openjdk-17-jdk
# 安装 FFmpeg 全套开发包(包含 libavdevice 及其头文件)
sudo apt install -y libavdevice-dev libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libsdl2-dev
# 2. 克隆scrcpy源码(指定3.3.4版本,避免兼容性问题)
git clone -b v3.3.4 https://github.com/Genymobile/scrcpy.git
cd scrcpy
# 3. 编译并安装(arm64架构自动适配)
meson setup build --buildtype release
ninja -C build
# 会有报错,接下来我教你处理,因为arm64在该版本的target没有相关的安卓编译sdk
  • 关于scrcpy编译,需要做以下修改
  • 先下载预编译版本
wget -O server/scrcpy-server-v3.3.4 https://github.com/Genymobile/scrcpy/releases/download/v3.3.4/scrcpy-server-v3.3.4
  • 随后需要修改脚本
rm -rf server/scripts/build-wrapper.sh
nano server/scripts/build-wrapper.sh
  • 然后覆盖填入
#!/usr/bin/env bash
# Wrapper script to invoke gradle from meson
set -e
# Do not execute gradle when ninja is called as root (it would download the
# whole gradle world in /root/.gradle).
# This is typically useful for calling "sudo ninja install" after a "ninja
# install"
if [[ "$EUID" == 0 ]]
then
    echo "(not invoking gradle, since we are root) - Using precompiled server" >&2
    PROJECT_ROOT="$1"
    OUTPUT="$2"
    cp "$PROJECT_ROOT/scrcpy-server-v3.3.4" "$OUTPUT"
    chmod +x "$OUTPUT"
    exit 0  # root用户成功返回
fi
PROJECT_ROOT="$1"
OUTPUT="$2"
BUILDTYPE="$3"
# 注释掉Gradle相关代码
# GRADLE=${GRADLE:-$PROJECT_ROOT/../gradlew}
if [[ "$BUILDTYPE" == debug ]]
then
    echo "=== Using precompiled scrcpy-server (debug mode, arm64 compatible) ==="
    cp "$PROJECT_ROOT/scrcpy-server-v3.3.4" "$OUTPUT"
    chmod +x "$OUTPUT"
else
    echo "=== Using precompiled scrcpy-server (release mode, arm64 compatible) ==="
    cp "$PROJECT_ROOT/scrcpy-server-v3.3.4" "$OUTPUT"
    chmod +x "$OUTPUT"
fi
# 关键添加:明确返回成功状态码,让ninja继续执行后续编译
exit 0
  • 随后安装即可:
# 继续编译
sudo chmod +x server/scripts/*.sh
ninja -C build
sudo ninja -C build install
# 验证安装成功
scrcpy --version  # 输出3.3.4即正常
image

三、配置 arm64 版 ADB(解决架构不兼容问题)

  • ADB 版本太旧!pair 命令是安卓 11 + 新增的(需 ADB 30.0.0+)
  • 普通 Linux 的 ADB 为 x86_64 架构,需安装 arm64 专属版本:
# 1. 卸载旧版ADB(避免路径冲突)
# 卸载 apt 安装的旧版 ADB
sudo apt remove android-tools-adb -y
# 2. 下载官方最新版 platform-tools(包含 arm64 版 ADB)
wget https://github.com/AndroidIDEOfficial/platform-tools/releases/download/v34.0.4/platform-tools-34.0.4-aarch64.tar.xz -O ~/platform-tools.tar.xz
# 3. 解压到用户目录
tar -xvf platform-tools.tar.xz
# 4. 验证 ADB 版本(需显示 30.0.0+,支持 pair 命令)
~/platform-tools/adb --version
# 安装到系统bin
sudo cp ~/platform-tools/{adb,fastboot,etc1tool,dmtracedump,e2fsdroid,hprof-conv,sqlite3} /usr/local/bin/
image

四、无线调试配对与 ADB 连接(本地网络,无需 WiFi)

通过安卓 “无线调试” 功能实现子系统与宿主机的本地连接,避免 USB 依赖:

安卓设备操作:

  • 开启「开发者选项」(设置→关于手机→连续点击版本号);
  • 开启「无线调试」,点击「配对设备(使用配对码)」;
  • 记录弹出的「配对地址(如localhost:41955)」和「6 位配对码」。

Linux 子系统操作:

adb kill-server && adb start-server

# 1. 配对设备(替换为实际地址和配对码)
adb pair localhost:41955 675984

# 2. 连接设备(默认端口5555,以设备显示为准)
adb connect localhost:41955

# 验证连接(显示device即正常)
adb devices

五、音频转接配置(核心:虚拟设备 + 强制绑定)

通过 Pulseaudio 创建虚拟音频设备,将 scrcpy 转发的麦克风音频转为子系统可识别的输入源:

# 1. 清理旧模块(避免冲突,首次执行可忽略报错)
pactl unload-module module-remap-source 2>/dev/null
pactl unload-module module-null-sink 2>/dev/null

# 2. 创建虚拟sink(接收scrcpy的音频输出)
pactl load-module module-null-sink sink_name=scrcpy_sink  # 输出模块ID(如18)

# 3. 创建虚拟source(作为子系统音频输入,命名为scrcpy_mic)
pactl load-module module-remap-source source_name=scrcpy_mic master=scrcpy_sink.monitor  # 输出模块ID(如19)

# 4. 启动scrcpy并强制音频输出到虚拟设备(关键:PULSE_SINK绑定)
PULSE_SINK=scrcpy_sink scrcpy \
  --audio-source=mic \
  --no-video \
  --audio-buffer=20 \
  --audio-codec=aac \
  --serial=localhost:41955

能否将上述的mic重定向的方法,整合进这个软件吗?这样就不用单独编译scrcpy了

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions