使用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 profileapac.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 部署、希望数据严格驻留印度时,可移除
BedrockNovaMicroApacProfileTokyo与BedrockNovaMicroFoundationModelApacTargets。 - 只在东京 region 部署时,可移除
BedrockGemmaInRegionMumbai。 - 在 Bedrock 控制台 Model Access 页面需先 enable
Google Gemma 3 4B(孟买)和Amazon Nova Micro(东京),否则即使 IAM 通过也会返回AccessDeniedException。 - 当前代码只识别
ap-south-1与ap-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:
- JVM 参数
-Daws.region=<region> - 环境变量
AWS_REGION/AWS_DEFAULT_REGION ~/.aws/config当前 profile 的region<- 当前配置文件使用这个- 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)
Geographic cross-Region inference - Amazon Bedrock
AWS SDK Region selection - DefaultAwsRegionProviderChain
最后修改于 2026-05-29