sync: migrate ai-operator to Gitea (2026-08-10)
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
package asteriskws
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"math"
|
||||
"time"
|
||||
|
||||
"ai-operator/internal/audio"
|
||||
"ai-operator/internal/media"
|
||||
)
|
||||
|
||||
func GenerateSilence(codec media.Codec, duration time.Duration, sampleRate int) []byte {
|
||||
if duration <= 0 || sampleRate <= 0 {
|
||||
return nil
|
||||
}
|
||||
switch codec {
|
||||
case media.CodecSLIN16:
|
||||
case media.CodecULaw:
|
||||
samples := int(duration.Seconds() * float64(sampleRate))
|
||||
out := make([]byte, samples)
|
||||
for i := range out {
|
||||
out[i] = 0xff
|
||||
}
|
||||
return out
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
samples := int(duration.Seconds() * float64(sampleRate))
|
||||
return make([]byte, samples*2)
|
||||
}
|
||||
|
||||
func GenerateSineToneSLIN16(frequencyHz float64, duration time.Duration, sampleRate int, amplitude float64) []byte {
|
||||
if frequencyHz <= 0 || duration <= 0 || sampleRate <= 0 {
|
||||
return nil
|
||||
}
|
||||
if amplitude < 0 {
|
||||
amplitude = 0
|
||||
}
|
||||
if amplitude > 1 {
|
||||
amplitude = 1
|
||||
}
|
||||
samples := int(duration.Seconds() * float64(sampleRate))
|
||||
out := make([]byte, samples*2)
|
||||
for i := 0; i < samples; i++ {
|
||||
v := int16(math.Sin(2*math.Pi*frequencyHz*float64(i)/float64(sampleRate)) * amplitude * math.MaxInt16)
|
||||
binary.LittleEndian.PutUint16(out[i*2:], uint16(v))
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
func GenerateSineTone(codec media.Codec, frequencyHz float64, duration time.Duration, sampleRate int, amplitude float64) []byte {
|
||||
pcm := GenerateSineToneSLIN16(frequencyHz, duration, sampleRate, amplitude)
|
||||
if codec == media.CodecULaw {
|
||||
return audio.EncodeULaw(pcm)
|
||||
}
|
||||
if codec == media.CodecSLIN16 {
|
||||
return pcm
|
||||
}
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user