chore: migrate project into clean repository

This commit is contained in:
yuuux
2026-08-13 16:50:52 +08:00
commit d1d25a09e7
27405 changed files with 9422808 additions and 0 deletions

View File

@@ -0,0 +1,154 @@
# Tone 本地音频打包工具
本工具用于生成 app_player 的本地音频二进制文件,将多个音频文件打包成 `tone.bin``tone.h` 文件,供嵌入式设备使用。
## 功能说明
该工具可以:
1. 处理音频文件(裁剪静音、格式转换)
2. 将多个音频文件打包成二进制文件 `tone.bin`
3. 生成头文件 `tone.h`,包含音频 ID 枚举定义
## 音频文件要求
原始音频文件需满足以下格式要求:
- **采样率**: 16 kHz
- **位深度**: 16 bit
- **格式**: MP3 或 PCM
- **存放位置**: [ring/](ring/) 目录下
## 使用方法
### 快速使用
将符合要求的音频文件放入 [ring/](ring/) 目录,然后执行:
```shell
./run.sh
```
执行后会在 [ring/](ring/) 目录下生成:
- `tone.bin` - 音频二进制数据文件
- `tone.h` - C 头文件,包含音频 ID 定义
### 高级用法
使用 [proc.sh](proc.sh) 脚本可以进行更精细的控制:
```shell
# 1. 仅打包路径下的音频文件(不处理静音)
./proc.sh -p ./ring
# 2. 处理并打包路径下的音频文件(裁剪静音 + 打包)
./proc.sh -d ./ring
# 3. 处理指定的单个音频文件
./proc.sh -f ./ring/test.mp3
```
参数说明:
- `-p, --pack <目录>` - 仅打包目录下的音频文件
- `-d, --dir <目录>` - 处理并打包目录下的所有音频文件
- `-f, --file <文件>` - 处理指定的单个音频文件
- `-h, --help` - 显示帮助信息
## 音频命名规范
音频文件名应使用数字前缀进行排序,例如:
```
000_greeting.mp3
001_network_suc.mp3
002_network_fail.mp3
003_no_intention.mp3
...
```
工具会按文件名排序后生成对应的 `TONE_ID_0`, `TONE_ID_1` 等枚举值。
## 生成文件说明
### tone.h
头文件包含音频 ID 枚举定义,示例:
```c
#ifndef __LISTENAI_TONE_PACKAGE_H__
#define __LISTENAI_TONE_PACKAGE_H__
enum {
TONE_ID_0 = 0, // 000_greeting.mp3
TONE_ID_1 = 1, // 001_network_suc.mp3
TONE_ID_2 = 2, // 002_network_fail.mp3
...
};
#endif
```
### tone.bin
二进制打包文件,包含所有音频数据,需要烧录到设备的 Flash 中。
## 代码使用示例
在代码中通过 `app_tone_get_url()` 函数获取本地音频 URL
```c
#include "app_tone.h"
#include "ring/tone.h"
// 初始化音频系统
app_tone_default_init();
// 获取音频 URL
char *url = app_tone_get_url(TONE_ID_0);
// 使用 URL 播放音频
// ...
```
更多 API 说明请参考 [components/app_player/tone/app_tone.h](../../components/app_player/tone/app_tone.h)。
## 配置说明
工具的配置文件为 [config.sh](config.sh),可以配置:
### 工具路径配置
- `FFMPEG_EXE` - FFmpeg 工具路径(默认:`cmd/ffmpeg-64`
- `TONETOOL_EXE` - 音频打包工具路径(默认:`cmd/tone_tool`
- `ID3TAG_EXE` - ID3 标签移除工具(默认:`id3v2`,需安装)
### 静音裁剪配置
- `MUTE_THRESHOLD` - 静音检测阈值(默认:`-50dB`
- `MUTE_SAVE_PREFIX_TIME` - 音频开头保留的静音时长(默认:`0.01` 秒)
- `MUTE_SAVE_SUFFIX_TIME` - 音频结尾保留的静音时长(默认:`0.01` 秒)
- `MUTE_AUDIO_RATE` - 裁剪后的音频码率(默认:`24k`
### 输出路径配置
- `PACK_TONE_OUT_BINARY` - 二进制文件输出路径(默认为空,生成在 ring 目录)
- `PACK_TONE_OUT_HEADER` - 头文件输出路径(默认为空,生成在 ring 目录)
## 环境依赖
- Linux 系统x86-64 架构)
- `id3v2` 工具(用于移除 MP3 的 ID3 标签)
安装依赖:
```shell
sudo apt-get install id3v2
```
## 工作流程
1. 将音频文件复制到处理
2. 使用 FFmpeg 裁剪音频首尾静音
3. 转换音频格式为 16kHz, 单声道, MP3
4. 移除 MP3 的 ID3 标签
5. 使用 tone_tool 打包所有音频为 tone.bin
6. 生成包含音频 ID 枚举的 tone.h 头文件
## 注意事项
- 音频文件名中的数字前缀决定了音频 ID 的顺序
- 如需支持其他平台,请从 [FFmpeg官网](https://ffbinaries.com/downloads) 下载对应平台的 FFmpeg 工具,并修改 [config.sh](config.sh) 中的 `FFMPEG_EXE` 配置
- 生成的 `tone.bin` 需要烧录到设备 Flash 的指定位置,具体地址由应用代码中的 `app_tone_init()` 参数决定

Binary file not shown.

View File

@@ -0,0 +1,3 @@
1. 可执行文件来源于: https://ffbinaries.com/downloads
2. 当前仅包含Linux 64位版本, 其余版本请访问网站下载

Binary file not shown.

View File

@@ -0,0 +1,42 @@
#!/bin/bash
# 平台类型
OS_ARCH=`arch`
############ 工具文件配置 ############
# FFPEG x86-64 平台工具
# 如需其它平台工具, 请自行下载后更改此配置
FFMPEG_EXE=$CUR_DIR/cmd/ffmpeg-64
# 打包音频文件为tone.bin的工具
TONETOOL_EXE=$CUR_DIR/cmd/tone_tool
# 去除 ID3TAG 工具
ID3TAG_EXE=id3v2
#####################################
############ 裁剪静音功能配置 ############
# 静音检测阈值, 以dB为单位
MUTE_THRESHOLD=-50dB
# 裁剪静音时, 音频开始至少保留的静音时长, 秒为单位
MUTE_SAVE_PREFIX_TIME=0.01
# 裁剪静音时, 音频结尾至少保留的静音时长, 秒为单位
MUTE_SAVE_SUFFIX_TIME=0.01
# 裁剪静音后生成的文件的码率, 默认按照 24kbps 生成
# 可配置码率有: 16kbps, 24kbps, 40kbps, 56kbps, 64kbps, 112kbps, 128kbps ...
MUTE_AUDIO_RATE=24k
#####################################
############ 打包音频包 ############
# 音频二进制文件输出路径, 若不需要输出, 则赋值空 ''
PACK_TONE_OUT_BINARY=''
# PACK_TONE_OUT_BINARY=$CUR_DIR/../../res
# 音频头文件输出路径, 若不需要输出, 则赋值空 ''
PACK_TONE_OUT_HEADER=''
#####################################

228
arcs-sdk/tools/tone_tool/proc.sh Executable file
View File

@@ -0,0 +1,228 @@
#!/bin/bash
# 当前目录
CUR_DIR=`pwd`
# 配置文件目录
CONFIG_FILE=$CUR_DIR/config.sh
# 使能配置
source $CONFIG_FILE
if [ ! -f $FFMPEG_EXE ]; then
echo "工具不存在: $FFMPEG_EXE"
exit
fi
if [ ! -f $TONETOOL_EXE ]; then
echo "工具不存在: $TONETOOL_EXE"
exit
fi
WHICH_ID3_TOOL=`which $ID3TAG_EXE`
if [ -z $WHICH_ID3_TOOL ]; then
echo "工具不存在: $ID3TAG_EXE, 请安装: sudo apt-get install id3v2"
exit
fi
PROC_USER_ARG=''
PROC_IS_FILE=0
PROC_ONLY_PACK=0
function showHelp()
{
echo "脚本使用示例:"
echo "1) ./proc.sh -p ./ring -p: 仅打包路径下的音频文件"
echo "2) ./proc.sh -d ./ring -d: 处理并打包路径下的音频文件"
echo "3) ./proc.sh -f ./ring/test.mp3 -f: 处理指定的音频文件"
}
# 脚本传参解析
if [[ $# -le 1 ]]; then
showHelp
exit
fi
while [[ $# -gt 0 ]]; do
case "$1" in
-h|--help)
showHelp
exit
;;
-f|--file)
if [ -n "$2" ]; then
if [ -f $2 ]; then
echo "处理文件: $2"
PROC_IS_FILE=1
PROC_USER_ARG=$2
break
else
echo "文件无效: $2 "
exit
fi
else
echo "请指定文件"
exit
fi
;;
-d|--dir)
if [ -n "$2" ]; then
if [ -d $2 ]; then
echo "处理目录: $2"
PROC_USER_ARG=$2
break
else
echo "处理目录无效: $2 "
exit
fi
else
echo "请指定处理目录"
exit
fi
;;
-p|--pack)
if [ -n "$2" ]; then
if [ -d $2 ]; then
echo "仅打包目录: $2"
PROC_ONLY_PACK=1
PROC_USER_ARG=$2
break
else
echo "打包目录无效: $2 "
exit
fi
else
echo "请指定打包目录"
exit
fi
;;
*)
echo "不支持的选项: $1"
showHelp
exit
;;
esac
shift
done
echo "OS ARCH: $OS_ARCH"
echo "Please Visit: https://ffbinaries.com/downloads to view all ffmpeg versions"
# 静音去除
FP0=silenceremove
# 在音频开头修剪音频
FPSP=start_periods=1
# 停止裁剪音频之前必须检测到的非静音时长
FPSD=start_duration=0
# 静音检测阈值
FPST=start_threshold=$MUTE_THRESHOLD
# 头部起始静音时间
FPSS1=start_silence=$MUTE_SAVE_PREFIX_TIME
# 尾部起始静音时间
FPSS2=start_silence=$MUTE_SAVE_SUFFIX_TIME
# 使用幅度值 amplitude 计算
FPD=detection=peak
# 反转
FPAV=areverse
# FFMPEG 参数
FFMPEG_PARAM=${FP0}=${FPSP}:${FPSD}:${FPST}:${FPSS1}:${FPD},${FPAV},${FP0}=${FPSP}:${FPSD}:${FPST}:${FPSS2}:${FPD},${FPAV}
# 处理函数
function proc_audio()
{
in_file=$1
out_file=$2
in_file_suffix=${in_file##*.}
in_file_prefix=${in_file%%.*}
out_file_prefix=${out_file%%.*}
if [ $in_file_suffix == "pcm" ] || [ $in_file_suffix == "mp3" ]; then
if [ $in_file_suffix == "pcm" ]; then
mp3_file=$in_file_prefix.mp3
if [ -f $mp3_file ]; then
rm $mp3_file
fi
# 转换PCM为MP3, 只处理16K、单通道、16bit PCM音频
echo "转换PCM为MP3: $in_file -> $mp3_file"
$FFMPEG_EXE -f s16le -ar 16000 -ac 1 -i $in_file -c:a libmp3lame -b:a 96k -acodec mp3 $mp3_file
in_file=$mp3_file
out_file=$out_file_prefix.mp3
fi
echo "处理前后静音: $in_file"
$FFMPEG_EXE -hide_banner -loglevel warning -i $in_file -filter_complex \
"$FFMPEG_PARAM" \
-ar 16000 -ac 1 -b:a $MUTE_AUDIO_RATE -acodec mp3 $out_file -y
# 移动文件
mv $out_file $in_file
# 去除ID3v1 ID3v2 TAG
$ID3TAG_EXE -D $in_file >/dev/null
else
echo "不支持的文件后缀: $in_file_suffix"
fi
}
function pack_tone_binary()
{
echo "打包音频, 目录: $1"
if [ -f $1/tone.h ]; then
rm -rf $1/tone.h
fi
if [ -f $1/tone.bin ]; then
rm -rf $1/tone.bin
fi
$TONETOOL_EXE $1 > /dev/null
if [ ! -z "$PACK_TONE_OUT_BINARY" ] && [ -d $PACK_TONE_OUT_BINARY ]; then
mv $1/tone.bin $$PACK_TONE_OUT_BINARY
else
echo "音频包二进制文件: $1/tone.bin"
fi
if [ ! -z "$PACK_TONE_OUT_HEADER" ] && [ -d $PACK_TONE_OUT_HEADER ]; then
mv $1/tone.h $$PACK_TONE_OUT_HEADER
else
echo "音频包头文件: $1/tone.h"
fi
}
# 暂存文件夹
tmp_dir=$CUR_DIR/tmp
if [ -d $tmp_dir ]; then
rm -rf $tmp_dir
fi
mkdir $tmp_dir
if [ $PROC_IS_FILE -eq 1 ]; then
# 处理文件
audio_file=`basename $PROC_USER_ARG`
proc_audio $PROC_USER_ARG $tmp_dir/$audio_file
else
# 去除路径后的反斜杠
PROC_USER_ARG=$(echo "$PROC_USER_ARG" | sed 's/\/$//')
if [ $PROC_ONLY_PACK -eq 0 ]; then
# 处理目录
for audio_file in `ls $PROC_USER_ARG`
do
proc_audio $PROC_USER_ARG/$audio_file $tmp_dir/$audio_file
done
fi
pack_tone_binary $PROC_USER_ARG
fi
# 清除暂存文件夹
if [ -d $tmp_dir ]; then
rm -rf $tmp_dir
fi

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,8 @@
#ifndef __LISTENAI_TONE_PACKAGE_H__
#define __LISTENAI_TONE_PACKAGE_H__
enum {
TONE_ID_0 = 0,// 000_geeting.mp3
TONE_ID_1 = 1,// 001_network_suc.mp3
};
#endif

View File

@@ -0,0 +1,3 @@
rm -rf ring/tone.h
rm -rf ring/tone.bin
./cmd/tone_tool ring/