103 lines
3.0 KiB
Ruby
103 lines
3.0 KiB
Ruby
class SenseVoice < Formula
|
||
desc "A tool for voice recognition"
|
||
homepage "https://github.com/lovemefan/SenseVoice.cpp"
|
||
url "https://github.com/lovemefan/SenseVoice.cpp.git", branch: "main"
|
||
sha256 "7db9aac1da3de455da32744e8799a5390edc0e46cdf5ba4800815586d91aeebd" # Replace with actual checksum
|
||
version "0.1.0"
|
||
license "MIT"
|
||
|
||
depends_on "cmake" => :build
|
||
depends_on "git"
|
||
depends_on "sdl2" # 如果需要 SDL 支持
|
||
|
||
def install
|
||
system "git", "submodule", "update", "--init", "--recursive"
|
||
mkdir "build" do
|
||
system "cmake", "-DCMAKE_BUILD_TYPE=Release", "..", *std_cmake_args
|
||
system "make", "-j#{ENV.make_jobs}"
|
||
end
|
||
|
||
# 安装真正的可执行文件
|
||
bin.install "build/bin/sense-voice-main" => "sense-voice-real"
|
||
|
||
# 安装wrapper
|
||
(bin/"sense-voice").write <<~EOS
|
||
#!/bin/bash
|
||
set -e
|
||
|
||
if [[ $# -lt 1 ]]; then
|
||
echo "Usage: sense-voice [audio_file] [other_options]"
|
||
exit 1
|
||
fi
|
||
|
||
INPUT="$1"
|
||
shift
|
||
|
||
if [[ ! -f "$INPUT" ]]; then
|
||
echo "Error: File '$INPUT' not found."
|
||
exit 1
|
||
fi
|
||
|
||
EXT="${INPUT##*.}"
|
||
TMPFILE=""
|
||
|
||
if [[ "$EXT" == "wav" ]]; then
|
||
# 检查采样率和声道数
|
||
SAMPLE_RATE=$(ffprobe -v error -select_streams a:0 -show_entries stream=sample_rate -of csv=p=0 "$INPUT")
|
||
CHANNELS=$(ffprobe -v error -select_streams a:0 -show_entries stream=channels -of csv=p=0 "$INPUT")
|
||
|
||
if [[ "$SAMPLE_RATE" == "16000" && "$CHANNELS" == "1" ]]; then
|
||
# 完美符合
|
||
WAV_INPUT="$INPUT"
|
||
else
|
||
echo "Converting WAV: Resample to 16kHz Mono..."
|
||
TMPFILE=$(mktemp /tmp/audioXXXXXX.wav)
|
||
ffmpeg -y -i "$INPUT" -ar 16000 -ac 1 -c:a pcm_s16le "$TMPFILE"
|
||
WAV_INPUT="$TMPFILE"
|
||
fi
|
||
else
|
||
# 非WAV直接转
|
||
echo "Converting $INPUT to WAV using ffmpeg..."
|
||
TMPFILE=$(mktemp /tmp/audioXXXXXX.wav)
|
||
ffmpeg -y -i "$INPUT" -ar 16000 -ac 1 -c:a pcm_s16le "$TMPFILE"
|
||
WAV_INPUT="$TMPFILE"
|
||
fi
|
||
|
||
#{bin}/sense-voice-real "$WAV_INPUT" "$@"
|
||
|
||
if [[ -n "$TMPFILE" && -f "$TMPFILE" ]]; then
|
||
rm -f "$TMPFILE"
|
||
fi
|
||
EOS
|
||
|
||
chmod 0755, bin/"sense-voice"
|
||
|
||
# 安装lib动态库,保证运行时找到
|
||
lib.install Dir["build/lib/*.dylib"]
|
||
|
||
# 修复 sense-voice 中对 dylib 的引用
|
||
dylibs = Dir["#{lib}/*.dylib"]
|
||
dylibs.each do |dylib|
|
||
system "install_name_tool", "-change", "@rpath/#{File.basename(dylib)}", "@loader_path/../lib/#{File.basename(dylib)}", "#{bin}/sense-voice"
|
||
end
|
||
|
||
# 修复各个 dylib 之间的引用
|
||
dylibs.each do |target_dylib|
|
||
dylibs.each do |referenced_dylib|
|
||
referenced_basename = File.basename(referenced_dylib)
|
||
system "install_name_tool", "-change", "@rpath/#{referenced_basename}", "@loader_path/#{referenced_basename}", target_dylib
|
||
end
|
||
end
|
||
|
||
# 给 sense-voice 增加 rpath
|
||
system "install_name_tool", "-add_rpath", "@loader_path/../lib", "#{bin}/sense-voice"
|
||
end
|
||
|
||
test do
|
||
system "#{bin}/sense-voice", "--help"
|
||
end
|
||
end
|
||
|
||
|
||
|