RHEL 10.0 で epel-release を有効にする
sudo dnf update -y
sudo subscription-manager repos --enable codeready-builder-for-rhel-10-x86_64-rpms
sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-10.noarch.rpm
sudo dnf update -y
sudo subscription-manager repos --enable codeready-builder-for-rhel-10-x86_64-rpms
sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-10.noarch.rpm
PS C:\> aws ec2-instance-connect ssh --instance-id i-0aa38de21acf2aa1c --region ap-south-1
Bad permissions. Try removing permissions for user: \\OWNER RIGHTS (S-1-3-4) on file C:/Users/hikari/AppData/Local/Temp/tmpm9m1bf7j/private-key.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions for 'C:\\Users\\hikari\\AppData\\Local\\Temp\\tmpm9m1bf7j\\private-key' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "C:\\Users\\hikari\\AppData\\Local\\Temp\\tmpm9m1bf7j\\private-key": bad permissions
[email protected]: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
2025/06/11 時点での検証。
PS C:\> wsl -- aws ec2-instance-connect ssh --instance-id i-0aa38de21acf2aa1c --region ap-south-1
, #_
~\_ ####_ Amazon Linux 2023
~~ \_#####\
~~ \###|
~~ \#/ ___ https://aws.amazon.com/linux/amazon-linux-2023
~~ V~' '->
~~~ /
~~._. _/
_/ _/
_/m/'
Last login: Tue Jun 10 22:50:33 2025 from 192.168.0.183
[ec2-user@ip-192-168-0-4 ~]$
なぜ?
ダウングレードすれば接続できた。
治してほしいな。
参考: https://github.com/aws/aws-cli/issues/9114
msiexec.exe /i https://awscli.amazonaws.com/AWSCLIV2-2.17.35.msi
EC2 Instance Connect は、AWS EC2 インスタンスへの SSH 接続を簡素化するためのサービス。
従来の SSH 接続方法では、インスタンスに公開鍵を事前に配置する必要があったが、 EC2 Instance Connect を使用すると、一時的な SSH 公開鍵をインスタンスに送信し、接続を確立する。(ただし、一部の AMI を除き Instance Connect のパッケージをインストールする必要がある)
インスタンスへの接続方法は何パターンか存在する。

インターネットから直接接続する方法は、インターネットゲートウェイを経由するか NAT ゲートウェイを経由する必要がある。また、パブリック IP アドレスが必要で閉域網に限定する場合は使えない。
ssh コマンドが使用可能なため、一番簡単である。
ssh <ユーザー名>@<パブリック IP アドレス>
AWS CLI を使用して、EC2 Instance Connect エンドポイントを使用して接続すれば、 パブリック IP アドレスは不要である。
また、その分の料金 (月数百円) を節約することができる。
AWS CLI を用いて、以下のようなコマンドで接続できるが、あらかじめキーペアをインポートして置き、インスタンスにキーペアを設定する必要がある。
具体的な接続方法は、例えば以下のコマンドから可能である。
aws ec2-instance-connect ssh --private-key-file .ssh/id_ed25519 --os-user <ユーザー名> --instance-id <インスタンス ID> --connection-type eice
※ただし、あらかじめアクセスキーを取得しておき、aws configure で設定しておく。
インターネットに接続したくないかつ公式ではない AMI を使用したいという場合にこの接続方法を使用するのが最も良い。
Amazon Linux や Ubuntu は Instance Connect エンドポイントを作成しておけば、 マネジメントコンソール上からインスタンスに接続が可能である。
ただし、一部の AMI を除いて、Instance Connect のパッケージをインストールする必要がある。
詳しくは、https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-connect-set-up.html
セッションマネージャー用にエンドポイントを 2 つ設置、加えてインスタンスにセッションマネージャーからの接続を許可する IAM ロールをアタッチする必要がある。
また、一部の AMI を除いて、Session Manager のパッケージのインストールが必要である。
シリアルコンソールを用いると直接インスタンスへ接続が可能である。 パスワードが設定されていない場合はログインすらできないので注意である。
デフォルトですべての通信が許可されているので、 デフォルトで使用する場合は特に設定は必要ない。
最低限必要な設定を以下に示す。
インバウンドルールは、SSH (22) を許可する必要がある。
インスタンスの SSH サーバーのポート番号が 22 であるため、これを許可する。
アウトバウンドルールは、カスタム TCP (1024-65535) を許可する必要がある。
1024-65535 は SSH 接続時にクライアント側が使用するポート範囲である。
インバウンドルールは、SSH (22) を許可する必要がある。
この設定は必ず必要である。
セキュリティグループは通信を記憶 (ステートフル) しているため、通常はアウトバウンドルールの設定は不要である。
ステートフルのため不要である。
SSH (22) を許可する必要がある。
インスタンスの 22 番ポートに対し通信するため、これを許可する。
公式ページから AMI を入手します。
https://rockylinux.org/ja-JP/download
インスタンスに設定するアーキテクチャー (ARM (aarch64)) を選び、 Cloud Images の AWS AMI を選択。

バージョン番号でフィルターを掛け、条件にあったものを探す。

AMI ID はコピーできないので、デプロイボタンをクリックし、AWS コンソールからコピーする。
AMI ID で検索を掛けると、でてくる

所有者でフィルタリングしたほうが良いかも。
所有者 = 792107900819

ssh-keygen -t ed25519 コマンドを実行て公開鍵を作成し、.ssh/id_ed25519.pub をキーペアにインポートしておくNAT ゲートウェイよりも、パブリック IP アドレスのほうが安いので、Elastic IP を作成。
図にするとこんな感じで建てる。


EC2 Instance Connect エンドポイントを作成することで AWS CLI からログインできる。
というわけで、以下の条件で建てた。
PC のターミナルを開き、以下を実行。
aws ec2-instance-connect ssh --private-key-file .ssh/id_ed25519 --os-user rocky --instance-id i-*****************
Rocky Linux の AMI イメージには、Instance Connect パッケージがなく、マネジメントコンソールからの接続ができない。 そのため、パッケージをインストールする。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-connect-set-up.html を参考にパッケージをダウンロード。
curl https://amazon-ec2-instance-connect-us-west-2.s3.us-west-2.amazonaws.com/latest/linux_arm64/ec2-instance-connect.rhel8.rpm -o /tmp/ec2-instance-connect.rpm
curl https://amazon-ec2-instance-connect-us-west-2.s3.us-west-2.amazonaws.com/latest/linux_amd64/ec2-instance-connect-selinux.noarch.rpm -o /tmp/ec2-instance-connect-selinux.rpm
sudo dnf install -y /tmp/ec2-instance-connect.rpm /tmp/ec2-instance-connect-selinux.rpm
インストールが完了すると、マネコン上からアクセスできるようになる

CDK 作ったので載せておく。参考までに。
keyName (キーペア) の名前は変えておく。
import * as cdk from 'aws-cdk-lib';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
export interface RockyLinuxStackProps extends cdk.StackProps {
}
export class RockyLinuxStack extends cdk.Stack {
public constructor(scope: cdk.App, id: string, props: RockyLinuxStackProps = {}) {
super(scope, id, props);
// Resources
const ec2dhcpOptions = new ec2.CfnDHCPOptions(this, 'EC2DHCPOptions', {
domainName: 'ap-south-1.compute.internal',
domainNameServers: [
'AmazonProvidedDNS',
],
],
});
ec2dhcpOptions.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;
const ec2InternetGateway = new ec2.CfnInternetGateway(this, 'EC2InternetGateway', {
{
value: 'igw',
key: 'Name',
},
],
});
ec2InternetGateway.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;
const ec2vpc = new ec2.CfnVPC(this, 'EC2VPC', {
cidrBlock: '10.0.0.0/16',
enableDnsSupport: true,
instanceTenancy: 'default',
enableDnsHostnames: true,
{
value: 'vpc',
key: 'Name',
},
],
});
ec2vpc.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;
const ec2VPCGatewayAttachment = new ec2.CfnVPCGatewayAttachment(this, 'EC2VPCGatewayAttachment', {
vpcId: ec2vpc.ref,
internetGatewayId: ec2InternetGateway.ref,
});
ec2VPCGatewayAttachment.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;
const ec2NetworkAcl = new ec2.CfnNetworkAcl(this, 'EC2NetworkAcl', {
vpcId: ec2vpc.ref,
],
});
ec2NetworkAcl.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;
const ec2RouteTable = new ec2.CfnRouteTable(this, 'EC2RouteTable', {
vpcId: ec2vpc.ref,
});
ec2RouteTable.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;
const ec2SecurityGroup = new ec2.CfnSecurityGroup(this, 'EC2SecurityGroup', {
groupDescription: 'launch-wizard-1 created 2025-04-27T00:11:58.641Z',
groupName: 'launch-wizard-1',
vpcId: ec2vpc.ref,
securityGroupIngress: [
{
cidrIp: '0.0.0.0/0',
ipProtocol: 'tcp',
fromPort: 22,
toPort: 22,
},
{
cidrIp: '0.0.0.0/0',
ipProtocol: 'icmp',
fromPort: 8,
toPort: -1,
},
],
securityGroupEgress: [
{
cidrIp: '0.0.0.0/0',
ipProtocol: '-1',
fromPort: -1,
toPort: -1,
},
],
});
ec2SecurityGroup.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;
const ec2Subnet = new ec2.CfnSubnet(this, 'EC2Subnet', {
vpcId: ec2vpc.ref,
mapPublicIpOnLaunch: false,
enableDns64: false,
availabilityZoneId: 'aps1-az1',
privateDnsNameOptionsOnLaunch: {
EnableResourceNameDnsARecord: false,
HostnameType: 'ip-name',
EnableResourceNameDnsAAAARecord: false,
},
cidrBlock: '10.0.0.0/20',
ipv6Native: false,
{
value: 'subnet-public1-ap-south-1a',
key: 'Name',
},
],
});
ec2Subnet.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;
const ec2InstanceConnectEndpoint = new ec2.CfnInstanceConnectEndpoint(this, 'EC2InstanceConnectEndpoint', {
preserveClientIp: false,
securityGroupIds: [
ec2SecurityGroup.attrGroupId,
],
subnetId: ec2Subnet.attrSubnetId,
});
ec2InstanceConnectEndpoint.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;
const ec2vpcdhcpOptionsAssociation = new ec2.CfnVPCDHCPOptionsAssociation(this, 'EC2VPCDHCPOptionsAssociation', {
vpcId: ec2vpc.ref,
dhcpOptionsId: ec2dhcpOptions.ref,
});
ec2vpcdhcpOptionsAssociation.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;
const ec2RouteHg = new ec2.CfnRoute(this, 'EC2RouteHG', {
routeTableId: ec2RouteTable.ref,
destinationCidrBlock: '0.0.0.0/0',
gatewayId: ec2InternetGateway.ref,
});
ec2RouteHg.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;
const ec2SubnetNetworkAclAssociation = new ec2.CfnSubnetNetworkAclAssociation(this, 'EC2SubnetNetworkAclAssociation', {
networkAclId: ec2NetworkAcl.ref,
subnetId: ec2Subnet.ref,
});
ec2SubnetNetworkAclAssociation.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;
const ec2SubnetRouteTableAssociation = new ec2.CfnSubnetRouteTableAssociation(this, 'EC2SubnetRouteTableAssociation', {
routeTableId: ec2RouteTable.ref,
subnetId: ec2Subnet.ref,
});
ec2SubnetRouteTableAssociation.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;
const ec2Instance = new ec2.CfnInstance(this, 'EC2Instance', {
tenancy: 'default',
instanceInitiatedShutdownBehavior: 'stop',
cpuOptions: {
threadsPerCore: 1,
coreCount: 2,
},
blockDeviceMappings: [
{
ebs: {
volumeType: 'gp3',
iops: 3000,
volumeSize: 10,
encrypted: false,
deleteOnTermination: true,
},
deviceName: '/dev/sda1',
},
],
availabilityZone: 'ap-south-1a',
privateDnsNameOptions: {
enableResourceNameDnsARecord: false,
hostnameType: 'ip-name',
enableResourceNameDnsAaaaRecord: false,
},
ebsOptimized: true,
disableApiTermination: false,
keyName: 'hikari',
sourceDestCheck: true,
placementGroupName: '',
networkInterfaces: [
{
privateIpAddresses: [
{
privateIpAddress: '10.0.3.59',
primary: true,
},
],
secondaryPrivateIpAddressCount: 0,
deviceIndex: '0',
groupSet: [
ec2SecurityGroup.ref,
],
ipv6Addresses: [
],
subnetId: ec2Subnet.ref,
associatePublicIpAddress: true,
deleteOnTermination: true,
},
],
imageId: 'ami-0415efd8380284dc4',
instanceType: 't4g.medium',
monitoring: false,
],
creditSpecification: {
cpuCredits: 'unlimited',
},
});
ec2Instance.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;
const ec2ElasticIp = new ec2.CfnEIP(this, 'EC2ElasticIp', {
domain: 'vpc',
{
key: 'Name',
value: 'elastic-ip',
},
],
});
ec2ElasticIp.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;
const ec2EipAssociation = new ec2.CfnEIPAssociation(this, 'EC2EipAssociation', {
eip: ec2ElasticIp.ref,
instanceId: ec2Instance.ref,
});
ec2EipAssociation.cfnOptions.deletionPolicy = cdk.CfnDeletionPolicy.DELETE;
}
}
※ここでいうフリーソフトは原則無料で使えるものであり、オープンソースソフトウェアとは別物です。
InkScape
https://inkscape.org/ja/
Animaze (キャラクターを動かすやつ)
https://store.steampowered.com/app/1364390/
CrystalDiskMark
https://crystalmark.info/ja/software/crystaldiskmark/
CrystalDiskInfo
https://crystalmark.info/ja/software/crystaldiskinfo/
CPU-Z (CPUID)
https://www.cpuid.com/softwares/cpu-z.html
HWMonitor (CPUID)
https://www.cpuid.com/softwares/hwmonitor.html
Visual Studio Code
https://code.visualstudio.com/
Windows Terminal
https://learn.microsoft.com/ja-jp/windows/terminal/
Visual Studio Community (個人のみ)
https://visualstudio.microsoft.com/ja/vs/community/
DevToys (開発ツールの十徳ナイフ)
https://devtoys.app/
PowerToys (Windows の便利ツール)
https://learn.microsoft.com/ja-jp/windows/powertoys/install
「名前付きパイプ」を選択し、パイプ名を「COM1」に設定

sudo nano /etc/default/grub で GRUB の設定ファイルを開き、
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash console=ttyS0,115200n8"
に変更する。
保存後、
sudo update-grub
で GRUB の設定を適用する。
シリアルポートでログインできるようにサービスを設定する。
sudo systemctl enable [email protected]
sudo systemctl start [email protected]
管理者権限で起動する

管理者権限で起動する
| Serial line | Speed | Connection type: |
|---|---|---|
| \.\pipe\COM1 | 115200 | Serial |
に設定。


管理者権限で起動する

[System.Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("utf-8")
[System.Console]::InputEncoding = [System.Text.Encoding]::GetEncoding("utf-8")
plink.exe -serial \\.\pipe\COM1 -sercfg 115200,8,n,1,N
Ctrl + C で終了
VOICEVOX はエディターとエンジンとコアで構成されているとあります。
参考: 全体構成
エディターがアプリで、エンジンが http サーバー、コアが音声合成の処理を行うモジュールになっているらしいです。
つまり、エディターがエンジンに対して REST API (以下 API) を叩いているというわけですね。
というわけで、その API の内容を観察してみようという記事になります。
API のキャプチャーには Wireshark を用いました。
http and tcp.port == 50021 でフィルターをかけてみた結果が、こちら。

起動時には以下の情報を読み取っているようです。
/version/engine_manifest/speakers (ずんだもんなどのキャラクターリスト)/singers (〃)スピーカー・シンガー取得後は各キャラクターの情報をより詳細に取得しているようですね。(/speaker_info?speaker_uuid=xxx, /singer_info?speaker_uuid=xxx)

では実際にずんだもんで音声合成のリクエストを送って、API を覗いてみました。

以下のような流れで音声が取得されているみたいです。
/accent_phrases でアクセントの情報/synthesis?speaker=3 でずんだもんの声を合成(2.) で送っているリクエストボディの内容は、以下のように (1.) のレスポンスと似たようなものになっています。
したがって、(1.) でアクセントを取得し、(2.) でアクセントから音声を合成するという流れのようです。
httpie というツールを用いて API を叩きました。

ずんだもん (ノーマル) の id は 3 であることがわかりました。
ずんだもんなのだ でアクセント情報を取得してみました。
(スピーカー情報と異なり、POST リクエストで取得)

以下のようなリクエストボディーを作成します。
{
"accent_phrases": </accent_phrases で取得したデータ>,
"speedScale": 1,
"pitchScale": 0,
"intonationScale": 1,
"volumeScale": 1,
"prePhonemeLength": 0.1,
"postPhonemeLength": 0.1,
"outputSamplingRate": 24000,
"outputStereo": false,
"kana": ""
}
httpie では wav が扱えないようなので、PowerShell でリクエストを送ります。
# URLとJSONデータを定義
$url = 'http://localhost:50021/synthesis?speaker=3'
$jsonBody = @"
{
"accent_phrases": [
{
"moras": [
{
"text": "ズ",
"consonant": "z",
"consonant_length": 0.12722788751125336,
"vowel": "u",
"vowel_length": 0.11318323761224747,
"pitch": 5.773037910461426
},
{
"text": "ン",
"consonant": null,
"consonant_length": null,
"vowel": "N",
"vowel_length": 0.09306197613477707,
"pitch": 6.108947277069092
},
{
"text": "ダ",
"consonant": "d",
"consonant_length": 0.04249810427427292,
"vowel": "a",
"vowel_length": 0.09372275322675705,
"pitch": 6.09743070602417
},
{
"text": "モ",
"consonant": "m",
"consonant_length": 0.07012023776769638,
"vowel": "o",
"vowel_length": 0.1172478124499321,
"pitch": 5.932623386383057
},
{
"text": "ン",
"consonant": null,
"consonant_length": null,
"vowel": "N",
"vowel_length": 0.06496299058198929,
"pitch": 5.745952129364014
},
{
"text": "ナ",
"consonant": "n",
"consonant_length": 0.038462959229946136,
"vowel": "a",
"vowel_length": 0.08576127141714096,
"pitch": 5.5794854164123535
}
],
"accent": 1,
"pause_mora": null,
"is_interrogative": false
},
{
"moras": [
{
"text": "ノ",
"consonant": "n",
"consonant_length": 0.05504273623228073,
"vowel": "o",
"vowel_length": 0.0903041884303093,
"pitch": 5.551316261291504
},
{
"text": "ダ",
"consonant": "d",
"consonant_length": 0.05024997144937515,
"vowel": "a",
"vowel_length": 0.20450790226459503,
"pitch": 5.633930206298828
}
],
"accent": 2,
"pause_mora": null,
"is_interrogative": false
}
],
"speedScale": 1,
"pitchScale": 0,
"intonationScale": 1,
"volumeScale": 1,
"prePhonemeLength": 0.1,
"postPhonemeLength": 0.1,
"outputSamplingRate": 24000,
"outputStereo": false,
"kana": ""
}
"@
# HTTPヘッダーを作成
$headers = @{
'Content-Type' = 'application/json'
}
# POSTリクエストを送信し、レスポンスを取得
$response = Invoke-WebRequest -Uri $url -Method Post -Headers $headers -Body $jsonBody -OutFile "output.wav"
# 開いて再生
start output.wav
VOICEVOX: ずんだもん
以上!
「16 進数の少数 0.248 を 10 進数の分数で表したものはどれか。」の問題について簡単に解く方法を紹介します。
16 進数の問題は 2 進数を使う
16 進数を 2 進数に変換
0.248(16) = 0.0010 0100 1000(2)
小数点をなくす
0.0010 0100 1000(2)
= 0.0010 0100 1000(2) × 0010 0000 0000(2) / 0010 0000 0000(2)
= 0100 1001(2) / 0010 0000 0000(2)
2 進数を 10 進数に変換
0100 1001(2) / 0010 0000 0000(2)
= (64 + 8 + 1) / 512
= 73 / 512