使用Transcribe+Polly实现MacOS本机设备控制的Demo

本文在MacOS上构建了一个Java Demo程序,将本机麦克风的音频以流式方式实时送入 Amazon Transcribe Streaming,输出英文转写结果,并演示设备控制 MacOS 本机的音量调节、静音等。只有白名单清单中的命令将会被接受,如果不在白名单中,则提示无法识别。

一、项目说明

1、用途

将本机麦克风的音频以流式方式实时送入 Amazon Transcribe Streaming,输出英文转写结果,并演示设备控制 MacOS 本机的音量调节、静音等。只有白名单清单中的命令将会被接受,如果不在白名单中,则提示无法识别。

通过调用大语言模型,可实现模糊的语义识别,在语音转录信息不属于白名单清单时,可通过LLM进行模糊匹配。匹配成功则执行指令,匹配不成功则提示无法识别命令。

2、代码结构

Github网址:https://github.com/aobao32/device-control-demo

device-control-demo/
├── README.md
└── transcribe-java/
    ├── pom.xml
    └── src/main/
        ├── java/com/example/devicecontrol/
        │   ├── TranscribeStreamingApp.java
        │   ├── VoiceCommandRouter.java
        │   ├── IntentClassifier.java
        │   ├── MacVolumeController.java
        │   ├── MicGate.java
        │   └── PollyAnnouncer.java
        └── resources/
            └── log4j2.xml

3、关键参数

项目
区域 由 AKSK 密钥配置(见第二章节)
语言 本演示使用 en-US 英语
编码 PCM 16-bit, 16 kHz, mono
AWS SDK for Java v2 2.44.12
JDK Amazon Corretto 17 或更高(本机使用 21)

二、配置AWS密钥AKSK(即Access Key/Secret Key)

1、创建IAM用户并附加最小权限策略

新建一个IAM用户,为其附加如下自定义内联策略(最小权限),其中 <ACCOUNT_ID> 替换为你的 AWS 账户 ID。

本程序按 region 自动选择 Bedrock 调用方式:

  • ap-south-1(孟买):In-Region 直接调用 google.gemma-3-4b-it,请求与数据全部留在印度 region 内,满足数据驻留要求。该模型是 Mumbai 当前最便宜的可 on-demand 直调模型。
  • ap-northeast-1(东京):使用 APAC Geographic cross-region inference profile apac.amazon.nova-micro-v1:0。东京当前不允许直接 on-demand 调用 amazon.nova-micro-v1:0,必须走 profile;请求可能被路由到 APAC 内任意目标 region。按 Geographic cross-Region inference IAM 要求,需要同时授权 inference profile ARN 与所有目标 region 上的 foundation model ARN。
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "TranscribeStreamingFromMic",
      "Effect": "Allow",
      "Action": [
        "transcribe:StartStreamTranscription",
        "transcribe:StartStreamTranscriptionWebSocket"
      ],
      "Resource": "*"
    },
    {
      "Sid": "PollyTextToSpeech",
      "Effect": "Allow",
      "Action": [
        "polly:SynthesizeSpeech"
      ],
      "Resource": "*"
    },
    {
      "Sid": "BedrockGemmaInRegionMumbai",
      "Effect": "Allow",
      "Action": [
        "bedrock:InvokeModel"
      ],
      "Resource": [
        "arn:aws:bedrock:ap-south-1::foundation-model/google.gemma-3-4b-it"
      ]
    },
    {
      "Sid": "BedrockNovaMicroApacProfileTokyo",
      "Effect": "Allow",
      "Action": [
        "bedrock:InvokeModel"
      ],
      "Resource": [
        "arn:aws:bedrock:ap-northeast-1:<ACCOUNT_ID>:inference-profile/apac.amazon.nova-micro-v1:0"
      ]
    },
    {
      "Sid": "BedrockNovaMicroFoundationModelApacTargets",
      "Effect": "Allow",
      "Action": [
        "bedrock:InvokeModel"
      ],
      "Resource": [
        "arn:aws:bedrock:ap-northeast-1::foundation-model/amazon.nova-micro-v1:0",
        "arn:aws:bedrock:ap-northeast-2::foundation-model/amazon.nova-micro-v1:0",
        "arn:aws:bedrock:ap-northeast-3::foundation-model/amazon.nova-micro-v1:0",
        "arn:aws:bedrock:ap-south-1::foundation-model/amazon.nova-micro-v1:0",
        "arn:aws:bedrock:ap-south-2::foundation-model/amazon.nova-micro-v1:0",
        "arn:aws:bedrock:ap-southeast-1::foundation-model/amazon.nova-micro-v1:0",
        "arn:aws:bedrock:ap-southeast-2::foundation-model/amazon.nova-micro-v1:0"
      ]
    }
  ]
}

权限说明:

语句 服务 用途
TranscribeStreamingFromMic Amazon Transcribe Streaming 将麦克风 PCM 通过 HTTP/2 流送入 Transcribe,得到实时英文转写
PollyTextToSpeech Amazon Polly 用 Amy 英国女声合成 TTS 反馈语音(孟买走 Neural 引擎,东京默认走 Generative)
BedrockGemmaInRegionMumbai Amazon Bedrock 印度 region In-Region 调用 Gemma 3 4B,数据驻留印度
BedrockNovaMicroApacProfileTokyo Amazon Bedrock 东京 region 走 APAC cross-region inference profile 调用 Nova Micro
BedrockNovaMicroFoundationModelApacTargets Amazon Bedrock profile 路由到目标 region 时校验对底层 Nova Micro foundation model 的访问

注意事项:

  • transcribe:*polly:SynthesizeSpeech 不支持资源级 ARN,所以 Resource*
  • 不启用 LLM 模糊匹配(默认)时,可移除全部 Bedrock* 语句。
  • 只在印度 region 部署、希望数据严格驻留印度时,可移除 BedrockNovaMicroApacProfileTokyoBedrockNovaMicroFoundationModelApacTargets
  • 只在东京 region 部署时,可移除 BedrockGemmaInRegionMumbai
  • 在 Bedrock 控制台 Model Access 页面需先 enable Google Gemma 3 4B(孟买)和 Amazon Nova Micro(东京),否则即使 IAM 通过也会返回 AccessDeniedException
  • 当前代码只识别 ap-south-1ap-northeast-1 两个 region;用其它 region 启动 LLM 模糊匹配时会抛出 IllegalStateException 提示不支持。

2、配置AKSK与默认region

编辑 ~/.aws/credentials 配置密钥:

[default]
aws_access_key_id = your-access-key-here
aws_secret_access_key = your-secret-key-here

编辑 ~/.aws/config 配置区域:

[default]
region = ap-south-1
output = json

程序按以下优先级解析 region:

  1. JVM 参数 -Daws.region=<region>
  2. 环境变量 AWS_REGION / AWS_DEFAULT_REGION
  3. ~/.aws/config 当前 profile 的 region <- 当前配置文件使用这个
  4. AWS 云上 EC2/ECS 运行环境的实例元数据

常用 region 选择:

  • ap-south-1(孟买):In-Region 调用 google.gemma-3-4b-it,数据驻留印度,单价为该 region 当前最低。
  • ap-northeast-1(东京):经 APAC cross-region inference profile 调用 Nova Micro。中国大陆访问东京网络延迟最低。
  • 其它 region 暂未在 LLM 路径中支持,启用 -Dintent.llm.enabled=true 时会抛出 IllegalStateException;不开 LLM 模糊匹配时其它 region 也可用。

三、构建与运行

以下命令均以 git 根目录(device-control-demo/)为当前工作目录。

1、前置条件

  • Amazon Corretto 17+(已验证 21),可替换为 OpenJDK 17
  • Maven 3.9+
  • 已配置 AWS 凭证(~/.aws/credentials 或环境变量)

2、构建Java包

cd transcribe-java
mvn clean package

构建产物:transcribe-java/target/transcribe-streaming-mic-1.0.0.jar(含全部依赖的可执行 fat jar)。

3、启动不带LLM语义理解的程序

java -jar transcribe-java/target/transcribe-streaming-mic-1.0.0.jar

4、启动带LLM支持语义理解的程序

使用参数开关:-Dintent.llm.enabled=true 启动;该参数默认 false。同时支持环境变量 INTENT_LLM_ENABLED=true 作为回退。

java -Dintent.llm.enabled=true -jar transcribe-java/target/transcribe-streaming-mic-1.0.0.jar

INTENT_LLM_ENABLED=true java -jar transcribe-java/target/transcribe-streaming-mic-1.0.0.jar

四、参考文档

Generate a transcription from a microphone using an AWS SDK

TranscribeStreamingAsyncClient (AWS SDK for Java)

AWS SDK for Java v2 - GitHub

Geographic cross-Region inference - Amazon Bedrock

Nova Micro model card

AWS SDK Region selection - DefaultAwsRegionProviderChain


最后修改于 2026-05-29