forked from fforchino/vector-go-sdk
-
Notifications
You must be signed in to change notification settings - Fork 0
/
sdk-wrapper-audio.go
131 lines (114 loc) · 3.41 KB
/
sdk-wrapper-audio.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package sdk_wrapper
import (
"errors"
"fmt"
"os"
"os/exec"
"strings"
"time"
"github.com/kirillgrishin-tech/vector-go-sdk/pkg/vectorpb"
)
var SYSTEMSOUND_WIN = "audio/win.pcm"
const VOLUME_LEVEL_MAXIMUM = 5
const VOLUME_LEVEL_MINIMUM = 1
var audioStreamClient vectorpb.ExternalInterface_AudioFeedClient
var audioStreamEnable bool = false
func EnableAudioStream() {
audioStreamClient, _ = Robot.Conn.AudioFeed(ctx, &vectorpb.AudioFeedRequest{})
audioStreamEnable = true
}
func DisableAudioStream() {
audioStreamEnable = false
audioStreamClient = nil
}
func ProcessAudioStream() {
if audioStreamEnable {
response, _ := audioStreamClient.Recv()
audioSample := response.SignalPower
println(string(audioSample))
}
}
// Returns values in the range 1-5
func GetMasterVolume() int {
return int(settings["master_volume"].(float64))
}
// Returns values in the range 0-100
func GetAudioVolume() int {
audioVol := 100 * GetMasterVolume() / VOLUME_LEVEL_MAXIMUM
return audioVol
}
func SetMasterVolume(volume int) error {
if volume <= VOLUME_LEVEL_MAXIMUM && volume >= VOLUME_LEVEL_MINIMUM {
_, err := Robot.Conn.SetMasterVolume(
ctx,
&vectorpb.MasterVolumeRequest{
VolumeLevel: vectorpb.MasterVolumeLevel(volume),
},
)
if err != nil {
RefreshSDKSettings()
}
return err
}
return fmt.Errorf("Invalid volume level")
}
// Plays one of the SYSTEMSOUND_... files
func PlaySystemSound(systemsound string) {
PlaySound(GetDataPath(systemsound))
}
// Plays amy sound file (mp3, wav, ecc) using FFMpeg to convert it to the right format
func PlaySound(filename string) string {
if _, err := os.Stat(filename); errors.Is(err, os.ErrNotExist) {
println("File not found!")
return "failure"
}
var pcmFile []byte
tmpFileName := GetTemporaryFilename("sound", "pcm", true)
if strings.Contains(filename, ".pcm") || strings.Contains(filename, ".raw") {
//fmt.Println("Assuming already pcm")
pcmFile, _ = os.ReadFile(filename)
} else {
_, conError := exec.Command("ffmpeg", "-y", "-i", filename, "-f", "s16le", "-acodec", "pcm_s16le", "-ar", "16000", "-ac", "1", tmpFileName).Output()
if conError != nil {
fmt.Println(conError)
}
//fmt.Println("FFMPEG output: " + string(conOutput))
pcmFile, _ = os.ReadFile(tmpFileName)
}
var audioChunks [][]byte
for len(pcmFile) >= 1024 {
audioChunks = append(audioChunks, pcmFile[:1024])
pcmFile = pcmFile[1024:]
}
var audioClient vectorpb.ExternalInterface_ExternalAudioStreamPlaybackClient
audioClient, _ = Robot.Conn.ExternalAudioStreamPlayback(
ctx,
)
audioClient.SendMsg(&vectorpb.ExternalAudioStreamRequest{
AudioRequestType: &vectorpb.ExternalAudioStreamRequest_AudioStreamPrepare{
AudioStreamPrepare: &vectorpb.ExternalAudioStreamPrepare{
AudioFrameRate: 16000,
AudioVolume: uint32(GetAudioVolume()),
},
},
})
//fmt.Println(len(audioChunks))
for _, chunk := range audioChunks {
audioClient.SendMsg(&vectorpb.ExternalAudioStreamRequest{
AudioRequestType: &vectorpb.ExternalAudioStreamRequest_AudioStreamChunk{
AudioStreamChunk: &vectorpb.ExternalAudioStreamChunk{
AudioChunkSizeBytes: 1024,
AudioChunkSamples: chunk,
},
},
})
time.Sleep(time.Millisecond * 30)
}
audioClient.SendMsg(&vectorpb.ExternalAudioStreamRequest{
AudioRequestType: &vectorpb.ExternalAudioStreamRequest_AudioStreamComplete{
AudioStreamComplete: &vectorpb.ExternalAudioStreamComplete{},
},
})
os.Remove(tmpFileName)
return "success"
}