@@ -4,33 +4,76 @@ import (
44 "crypto/md5"
55 "encoding/hex"
66 "fmt"
7- ffmpeg_go "github.com/u2takey/ffmpeg-go"
8- "log"
97 "os"
8+ "os/exec"
9+
10+ "github.com/Logiase/MiraiGo-Template/utils"
11+ "github.com/eric2788/go-silk/multiplat"
12+ ffmpeg_go "github.com/u2takey/ffmpeg-go"
13+ silk "github.com/wdvxdr1123/go-silk"
1014)
1115
16+ var logger = utils .GetModuleLogger ("valbot.aivoice" )
17+
1218const (
1319 AudioSamplingRateMP3 = "22050"
1420 AudioBitRate = "12.2k" // in Hz
1521 NumberOfAudioChannels = "1"
1622 AudioSamplingRateAMR = "8000"
1723)
1824
25+ func WavToSilk (b []byte ) (data []byte , err error ) {
26+ md := md5 .Sum (b )
27+ tempName := hex .EncodeToString (md [:])
28+
29+ wav , pcm := tempName + ".wav" , tempName + ".pcm"
30+ logger .Infof ("writing file: %s" , wav )
31+ err = os .WriteFile (wav , b , os .ModePerm )
32+ if err != nil {
33+ return nil , err
34+ }
35+ defer os .Remove (wav )
36+
37+ // 2.转换pcm
38+ logger .Infof ("converting to pcm..." )
39+ cmd := exec .Command ("ffmpeg" , "-i" , wav , "-f" , "s16le" , "-ar" , "24000" , "-ac" , "1" , pcm )
40+ logger .Infof ("converted to pcm: %s" , pcm )
41+ multiplat .HideWindow (cmd )
42+ if err = cmd .Run (); err != nil {
43+ return nil , err
44+ }
45+ defer os .Remove (pcm )
46+ pcmByte , err := os .ReadFile (pcm )
47+ if err != nil {
48+ return nil , err
49+ }
50+ logger .Infof ("converting to silk..." )
51+ defer func () {
52+ if err == nil {
53+ logger .Infof ("converted to silk: %s" , tempName + ".silk" )
54+ }
55+ }()
56+ data , err = silk .EncodePcmBuffToSilk (pcmByte , 24000 , 24000 , true )
57+ return
58+ }
59+
60+ // WavToAmr Wav To Amr file
61+ // Deprecated: use WavToSilk instead
1962func WavToAmr (b []byte ) (data []byte , err error ) {
2063 hash := md5 .Sum (b )
2164 name := hex .EncodeToString (hash [:])
2265 f , err := os .Create ("./" + name + ".wav" )
2366 if err != nil {
2467 return nil , err
2568 }
26- log . Println ("writing file: " , f .Name ())
69+ logger . Info ("writing file: " , f .Name ())
2770 _ , err = f .Write (b )
2871 f .Close ()
2972 defer removeFile (f .Name ())
3073 if err != nil {
3174 return nil , err
3275 }
33- log . Println ("converting to amr: " , f .Name ())
76+ logger . Info ("converting to amr: " , f .Name ())
3477 // Convert to AMR
3578 comm := ffmpeg_go .Input (name + ".wav" ).Output (name + ".amr" , ffmpeg_go.KwArgs {"ar" : AudioSamplingRateAMR , "ab" : AudioBitRate })
3679 //comm := exec.Command("ffmpeg", "-i", "./"+name+".wav", "-ab", AudioBitRate, "-ar", AudioSamplingRateAMR, name+".amr")
@@ -39,7 +82,7 @@ func WavToAmr(b []byte) (data []byte, err error) {
3982 }
4083 defer removeFile (name + ".amr" )
4184 data , err = os .ReadFile (name + ".amr" )
42- log . Println ("successfully converted to amr" )
85+ logger . Info ("successfully converted to amr" )
4386 return
4487}
4588
0 commit comments