Add Pascal API for reading wave files (#1243)
This commit is contained in:
112
.github/workflows/pascal.yaml
vendored
Normal file
112
.github/workflows/pascal.yaml
vendored
Normal file
@@ -0,0 +1,112 @@
|
||||
name: pascal
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
paths:
|
||||
- '.github/workflows/pascal.yaml'
|
||||
- 'CMakeLists.txt'
|
||||
- 'cmake/**'
|
||||
- 'pascal-api-examples/**'
|
||||
- 'sherpa-onnx/csrc/*'
|
||||
- 'sherpa-onnx/c-api/*'
|
||||
- 'sherpa-onnx/pascal-api/*'
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
paths:
|
||||
- '.github/workflows/pascal.yaml'
|
||||
- 'CMakeLists.txt'
|
||||
- 'cmake/**'
|
||||
- 'pascal-api-examples/**'
|
||||
- 'sherpa-onnx/csrc/*'
|
||||
- 'sherpa-onnx/c-api/*'
|
||||
- 'sherpa-onnx/pascal-api/*'
|
||||
|
||||
workflow_dispatch:
|
||||
|
||||
concurrency:
|
||||
group: pascal-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
pascal:
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [ubuntu-latest, macos-latest, macos-13]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: ccache
|
||||
uses: hendrikmuhs/ccache-action@v1.2
|
||||
with:
|
||||
key: ${{ matrix.os }}
|
||||
|
||||
- name: Install Free pascal compiler (ubuntu)
|
||||
if: matrix.os == 'ubuntu-latest'
|
||||
shell: bash
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -q -y fpc
|
||||
|
||||
- name: Install Free pascal compiler (macos)
|
||||
if: matrix.os == 'macos-latest' || matrix.os == 'macos-13'
|
||||
shell: bash
|
||||
run: |
|
||||
brew install fpc
|
||||
# brew install --cask lazarus
|
||||
|
||||
- name: FPC info
|
||||
shell: bash
|
||||
run: |
|
||||
which fpc
|
||||
fpc -i
|
||||
|
||||
- name: OS info
|
||||
shell: bash
|
||||
run: |
|
||||
uname -a
|
||||
|
||||
- name: Configure CMake
|
||||
shell: bash
|
||||
run: |
|
||||
export CMAKE_CXX_COMPILER_LAUNCHER=ccache
|
||||
export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
|
||||
cmake --version
|
||||
|
||||
mkdir build
|
||||
cd build
|
||||
|
||||
cmake \
|
||||
-D BUILD_SHARED_LIBS=ON \
|
||||
-D SHERPA_ONNX_ENABLE_BINARY=OFF \
|
||||
-D CMAKE_BUILD_TYPE=Release \
|
||||
..
|
||||
|
||||
- name: Build sherpa-onnx
|
||||
shell: bash
|
||||
run: |
|
||||
export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
|
||||
|
||||
cd build
|
||||
make -j2 sherpa-onnx-c-api
|
||||
|
||||
- name: Run Pascal test
|
||||
shell: bash
|
||||
run: |
|
||||
cd ./pascal-api-examples
|
||||
|
||||
echo "----read-wav test-----"
|
||||
pushd read-wav
|
||||
./run.sh
|
||||
ls -lh
|
||||
popd
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -114,3 +114,5 @@ lib*.a
|
||||
sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17
|
||||
*.bak
|
||||
vits-melo-tts-zh_en
|
||||
*.o
|
||||
*.ppu
|
||||
|
||||
@@ -29,9 +29,9 @@
|
||||
|--------|-------|-----------|-------|---------|---------------|
|
||||
| ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
|
||||
|
||||
| 7. Kotlin | 8. Swift | 9. Go | 10. Dart | 11. Rust |
|
||||
|-----------|----------|-------|----------|----------|
|
||||
| ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
|
||||
| 7. Kotlin | 8. Swift | 9. Go | 10. Dart | 11. Rust | 12. Pascal |
|
||||
|-----------|----------|-------|----------|----------|------------|
|
||||
| ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
|
||||
|
||||
For Rust support, please see https://github.com/thewh1teagle/sherpa-rs
|
||||
|
||||
|
||||
1
pascal-api-examples/read-wav/.gitignore
vendored
Normal file
1
pascal-api-examples/read-wav/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
main
|
||||
21
pascal-api-examples/read-wav/main.pas
Normal file
21
pascal-api-examples/read-wav/main.pas
Normal file
@@ -0,0 +1,21 @@
|
||||
{ Copyright (c) 2024 Xiaomi Corporation }
|
||||
program main;
|
||||
|
||||
{$mode objfpc}
|
||||
|
||||
uses
|
||||
sherpa_onnx;
|
||||
|
||||
var
|
||||
Wave: TSherpaOnnxWave;
|
||||
S: Single;
|
||||
I: Integer;
|
||||
begin
|
||||
Wave := SherpaOnnxReadWave('./lei-jun-test.wav');
|
||||
WriteLn('info ', Wave.SampleRate, ' ', Length(Wave.Samples));
|
||||
S := 0;
|
||||
for i := Low(Wave.Samples) to High(Wave.Samples) do
|
||||
S += Wave.Samples[i];
|
||||
|
||||
WriteLn('sum is ', S);
|
||||
end.
|
||||
38
pascal-api-examples/read-wav/run.sh
Executable file
38
pascal-api-examples/read-wav/run.sh
Executable file
@@ -0,0 +1,38 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -ex
|
||||
|
||||
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
|
||||
SHERPA_ONNX_DIR=$(cd $SCRIPT_DIR/../.. && pwd)
|
||||
|
||||
echo "SHERPA_ONNX_DIR: $SHERPA_ONNX_DIR"
|
||||
|
||||
if [[ ! -f ../../build/lib/libsherpa-onnx-c-api.dylib && ! -f ../../build/lib/libsherpa-onnx-c-api.so ]]; then
|
||||
mkdir -p ../../build
|
||||
pushd ../../build
|
||||
cmake \
|
||||
-DSHERPA_ONNX_ENABLE_PYTHON=OFF \
|
||||
-DSHERPA_ONNX_ENABLE_TESTS=OFF \
|
||||
-DSHERPA_ONNX_ENABLE_CHECK=OFF \
|
||||
-DBUILD_SHARED_LIBS=ON \
|
||||
-DSHERPA_ONNX_ENABLE_PORTAUDIO=OFF \
|
||||
..
|
||||
|
||||
make -j4 sherpa-onnx-c-api
|
||||
ls -lh lib
|
||||
popd
|
||||
fi
|
||||
|
||||
if [ ! -f ./lei-jun-test.wav ]; then
|
||||
curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/lei-jun-test.wav
|
||||
fi
|
||||
|
||||
fpc \
|
||||
-Fu$SHERPA_ONNX_DIR/sherpa-onnx/pascal-api \
|
||||
-Fl$SHERPA_ONNX_DIR/build/lib \
|
||||
./main.pas
|
||||
|
||||
export LD_LIBRARY_PATH=$SHERPA_ONNX_DIR/build/lib:$LD_LIBRARY_PATH
|
||||
export DYLD_LIBRARY_PATH=$SHERPA_ONNX_DIR/build/lib:$DYLD_LIBRARY_PATH
|
||||
|
||||
./main
|
||||
7
sherpa-onnx/pascal-api/README.md
Normal file
7
sherpa-onnx/pascal-api/README.md
Normal file
@@ -0,0 +1,7 @@
|
||||
# Introduction
|
||||
|
||||
This directory contains APIs for [Object Pascal](https://en.wikipedia.org/wiki/Object_Pascal).
|
||||
|
||||
Please see
|
||||
https://github.com/k2-fsa/sherpa-onnx/tree/master/pascal-api-examples
|
||||
for usages.
|
||||
77
sherpa-onnx/pascal-api/sherpa_onnx.pas
Normal file
77
sherpa-onnx/pascal-api/sherpa_onnx.pas
Normal file
@@ -0,0 +1,77 @@
|
||||
{ Copyright (c) 2024 Xiaomi Corporation }
|
||||
|
||||
unit sherpa_onnx;
|
||||
|
||||
{$mode objfpc}
|
||||
|
||||
interface
|
||||
|
||||
type
|
||||
TSherpaOnnxWave = record
|
||||
Samples: array of Single; { normalized to the range [-1, 1] }
|
||||
SampleRate: Integer;
|
||||
end;
|
||||
|
||||
{ It supports reading a single channel wave with 16-bit encoded samples.
|
||||
Samples are normalized to the range [-1, 1].
|
||||
}
|
||||
function SherpaOnnxReadWave(Filename: string): TSherpaOnnxWave;
|
||||
|
||||
implementation
|
||||
|
||||
uses
|
||||
ctypes;
|
||||
|
||||
const
|
||||
{See https://www.freepascal.org/docs-html/prog/progap7.html}
|
||||
|
||||
{$IFDEF WINDOWS}
|
||||
SherpaOnnxLibName = 'sherpa-onnx-c-api.dll';
|
||||
{$ENDIF}
|
||||
|
||||
{$IFDEF DARWIN}
|
||||
SherpaOnnxLibName = 'sherpa-onnx-c-api';
|
||||
{$linklib sherpa-onnx-c-api}
|
||||
{$ENDIF}
|
||||
|
||||
{$IFDEF LINUX}
|
||||
SherpaOnnxLibName = 'libsherpa-onnx-c-api.so';
|
||||
{$ENDIF}
|
||||
|
||||
type
|
||||
SherpaOnnxWave = record
|
||||
Samples: pcfloat;
|
||||
SampleRate: cint32;
|
||||
NumSamples: cint32;
|
||||
end;
|
||||
|
||||
PSherpaOnnxWave = ^SherpaOnnxWave;
|
||||
|
||||
function SherpaOnnxReadWaveWrapper(Filename: PAnsiChar): PSherpaOnnxWave; cdecl;
|
||||
external SherpaOnnxLibName name 'SherpaOnnxReadWave';
|
||||
|
||||
procedure SherpaOnnxFreeWaveWrapper(P: PSherpaOnnxWave); cdecl;
|
||||
external SherpaOnnxLibName name 'SherpaOnnxFreeWave';
|
||||
|
||||
function SherpaOnnxReadWave(Filename: string): TSherpaOnnxWave;
|
||||
var
|
||||
AnsiFilename: AnsiString;
|
||||
PFilename: PAnsiChar;
|
||||
PWave: PSherpaOnnxWave;
|
||||
I: Integer;
|
||||
begin
|
||||
AnsiFilename := Filename;
|
||||
PFilename := PAnsiChar(AnsiFilename);
|
||||
PWave := SherpaOnnxReadWaveWrapper(PFilename);
|
||||
|
||||
SetLength(Result.Samples, PWave^.NumSamples);
|
||||
|
||||
Result.SampleRate := PWave^.SampleRate;
|
||||
|
||||
for I := Low(Result.Samples) to High(Result.Samples) do
|
||||
Result.Samples[i] := PWave^.Samples[i];
|
||||
|
||||
SherpaOnnxFreeWaveWrapper(PWave);
|
||||
end;
|
||||
|
||||
end.
|
||||
Reference in New Issue
Block a user