- Updated Schema methods for various providers (OpenAI, Fastembed, MCP, OCR, Office, UTF8, Video, Vision, Whisper) to retrieve schemas from bindata, improving localization capabilities. - Removed outdated JSON files for embedding, extractor, and fetcher providers, streamlining the data structure. - Enhanced the overall provider management by ensuring schemas are dynamically loaded based on locale, facilitating better multi-language support.
149 lines
5 KiB
Go
149 lines
5 KiB
Go
package converters
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/yaoapp/gou/graphrag/converter"
|
|
"github.com/yaoapp/gou/graphrag/types"
|
|
"github.com/yaoapp/yao/kb/providers/factory"
|
|
kbtypes "github.com/yaoapp/yao/kb/types"
|
|
)
|
|
|
|
// Whisper is a converter provider for audio files
|
|
type Whisper struct {
|
|
Autodetect []string `json:"autodetect" yaml:"autodetect"` // Optional, default is empty, if not set, will not use autodetect
|
|
MatchPriority int `json:"match_priority" yaml:"match_priority"` // Optional, default is 0, the higher the number, the higher the priority
|
|
}
|
|
|
|
// Make creates a new Whisper converter
|
|
func (whisper *Whisper) Make(option *kbtypes.ProviderOption) (types.Converter, error) {
|
|
// Start with default values
|
|
whisperOption := converter.WhisperOption{
|
|
ConnectorName: "", // Will be set from option
|
|
Model: "", // Will use default from connector
|
|
Language: "", // Auto-detect
|
|
ChunkDuration: 30.0, // Default 30 seconds
|
|
MappingDuration: 5.0, // Default 5 seconds
|
|
SilenceThreshold: -40.0, // Default -40dB
|
|
SilenceMinLength: 1.0, // Default 1 second
|
|
EnableSilenceDetection: true, // Default enabled
|
|
MaxConcurrency: 4, // Default 4 concurrent requests
|
|
TempDir: "", // Will use system temp
|
|
CleanupTemp: true, // Default cleanup
|
|
Options: nil, // Additional options
|
|
}
|
|
|
|
// Extract values from Properties map
|
|
if option != nil && option.Properties != nil {
|
|
if connector, ok := option.Properties["connector"]; ok {
|
|
if connectorStr, ok := connector.(string); ok {
|
|
whisperOption.ConnectorName = connectorStr
|
|
}
|
|
}
|
|
|
|
if model, ok := option.Properties["model"]; ok {
|
|
if modelStr, ok := model.(string); ok {
|
|
whisperOption.Model = modelStr
|
|
}
|
|
}
|
|
|
|
if language, ok := option.Properties["language"]; ok {
|
|
if langStr, ok := language.(string); ok {
|
|
whisperOption.Language = langStr
|
|
}
|
|
}
|
|
|
|
if chunkDuration, ok := option.Properties["chunk_duration"]; ok {
|
|
if durationFloat, ok := chunkDuration.(float64); ok {
|
|
whisperOption.ChunkDuration = durationFloat
|
|
} else if durationInt, ok := chunkDuration.(int); ok {
|
|
whisperOption.ChunkDuration = float64(durationInt)
|
|
}
|
|
}
|
|
|
|
if mappingDuration, ok := option.Properties["mapping_duration"]; ok {
|
|
if durationFloat, ok := mappingDuration.(float64); ok {
|
|
whisperOption.MappingDuration = durationFloat
|
|
} else if durationInt, ok := mappingDuration.(int); ok {
|
|
whisperOption.MappingDuration = float64(durationInt)
|
|
}
|
|
}
|
|
|
|
if silenceThreshold, ok := option.Properties["silence_threshold"]; ok {
|
|
if thresholdFloat, ok := silenceThreshold.(float64); ok {
|
|
whisperOption.SilenceThreshold = thresholdFloat
|
|
} else if thresholdInt, ok := silenceThreshold.(int); ok {
|
|
whisperOption.SilenceThreshold = float64(thresholdInt)
|
|
}
|
|
}
|
|
|
|
if silenceMinLength, ok := option.Properties["silence_min_length"]; ok {
|
|
if lengthFloat, ok := silenceMinLength.(float64); ok {
|
|
whisperOption.SilenceMinLength = lengthFloat
|
|
} else if lengthInt, ok := silenceMinLength.(int); ok {
|
|
whisperOption.SilenceMinLength = float64(lengthInt)
|
|
}
|
|
}
|
|
|
|
if enableSilence, ok := option.Properties["enable_silence_detection"]; ok {
|
|
if enableBool, ok := enableSilence.(bool); ok {
|
|
whisperOption.EnableSilenceDetection = enableBool
|
|
}
|
|
}
|
|
|
|
if maxConcurrency, ok := option.Properties["max_concurrency"]; ok {
|
|
if maxInt, ok := maxConcurrency.(int); ok {
|
|
whisperOption.MaxConcurrency = maxInt
|
|
} else if maxFloat, ok := maxConcurrency.(float64); ok {
|
|
whisperOption.MaxConcurrency = int(maxFloat)
|
|
}
|
|
}
|
|
|
|
if tempDir, ok := option.Properties["temp_dir"]; ok {
|
|
if tempDirStr, ok := tempDir.(string); ok {
|
|
whisperOption.TempDir = tempDirStr
|
|
}
|
|
}
|
|
|
|
if cleanupTemp, ok := option.Properties["cleanup_temp"]; ok {
|
|
if cleanupBool, ok := cleanupTemp.(bool); ok {
|
|
whisperOption.CleanupTemp = cleanupBool
|
|
}
|
|
}
|
|
|
|
if options, ok := option.Properties["options"]; ok {
|
|
if optionsMap, ok := options.(map[string]interface{}); ok {
|
|
whisperOption.Options = optionsMap
|
|
}
|
|
}
|
|
}
|
|
|
|
return converter.NewWhisper(whisperOption)
|
|
}
|
|
|
|
// AutoDetect detects the converter based on the filename and content types
|
|
func (whisper *Whisper) AutoDetect(filename, contentTypes string) (bool, int, error) {
|
|
// If autodetect is empty, return false
|
|
if whisper.Autodetect == nil {
|
|
return false, 0, nil
|
|
}
|
|
|
|
// Check if the filename matches the autodetect
|
|
for _, autodetect := range whisper.Autodetect {
|
|
if strings.HasSuffix(filename, autodetect) {
|
|
return true, whisper.MatchPriority, nil
|
|
}
|
|
|
|
// Check if the content types matches the autodetect
|
|
if strings.Contains(contentTypes, autodetect) {
|
|
return true, whisper.MatchPriority, nil
|
|
}
|
|
}
|
|
|
|
return false, 0, nil
|
|
}
|
|
|
|
// Schema returns the schema for the Whisper converter
|
|
func (whisper *Whisper) Schema(provider *kbtypes.Provider, locale string) (*kbtypes.ProviderSchema, error) {
|
|
return factory.GetSchemaFromBindata(factory.ProviderTypeConverter, "whisper", locale)
|
|
}
|