Как сделать Pipecat SDK для Kotlin разрешить доступ к камере?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как сделать Pipecat SDK для Kotlin разрешить доступ к камере?

Сообщение Anonymous »

Я взял официальный пример репо-репо-репо (он только допускает голос и не отправляет видеодады в API Gemini. Тем не менее, я также хочу включить камеру. Я попытался установить eNableCam = true < /code>, но он все еще не разрешает входы камеры.
Следующее мое код: < /p>
package ai.pipecat.gemini_multimodal_websocket_demo

//imports here

@Immutable
data class Error(val message: String)

@Stable
class VoiceClientManager(private val context: Context) {

companion object {
private const val TAG = "VoiceClientManager"
}

private val client = mutableStateOf(null)

val state = mutableStateOf(null)

val errors = mutableStateListOf()

val actionDescriptions =
mutableStateOf(null)

val expiryTime = mutableStateOf(null)

val botReady = mutableStateOf(false)
val botIsTalking = mutableStateOf(false)
val userIsTalking = mutableStateOf(false)
val botAudioLevel = mutableFloatStateOf(0f)
val userAudioLevel = mutableFloatStateOf(0f)

val mic = mutableStateOf(false)
val camera = mutableStateOf(false)
val tracks = mutableStateOf(null)

private fun Future.displayErrors() = withErrorCallback {
Log.e(TAG, "Future resolved with error: ${it.description}", it.exception)
errors.add(Error(it.description))
}

fun start() {

if (client.value != null) {
return
}

val apiKey = "my_api_key" // = Preferences.apiKey.value ?: return

val options = RTVIClientOptions(
params = RTVIClientParams(
baseUrl = null,
config = GeminiLiveWebsocketTransport.buildConfig(
apiKey = apiKey,
systemInstruction = Value.Object(
"parts" to Value.Object(
"text" to Value.Str("You are a helpful assistant")
)
),
)
),
enableCam = true,
)

state.value = TransportState.Disconnected

val callbacks = object : RTVIEventCallbacks() {
override fun onTransportStateChanged(state: TransportState) {
this@VoiceClientManager.state.value = state
}

override fun onBackendError(message: String) {
"Error from backend: $message".let {
Log.e(TAG, it)
errors.add(Error(it))
}
}

override fun onBotReady(version: String, config: List) {

Log.i(TAG, "Bot ready. Version $version, config: $config")

botReady.value = true

client.value?.describeActions()?.withCallback {
actionDescriptions.value = it
}
}

override fun onPipecatMetrics(data: PipecatMetrics) {
Log.i(TAG, "Pipecat metrics: $data")
}

override fun onUserTranscript(data: Transcript) {
Log.i(TAG, "User transcript: $data")
}

override fun onBotTranscript(text: String) {
Log.i(TAG, "Bot transcript: $text")
}

override fun onBotStartedSpeaking() {
Log.i(TAG, "Bot started speaking")
botIsTalking.value = true
}

override fun onBotStoppedSpeaking() {
Log.i(TAG, "Bot stopped speaking")
botIsTalking.value = false
}

override fun onUserStartedSpeaking() {
Log.i(TAG, "User started speaking")
userIsTalking.value = true
}

override fun onUserStoppedSpeaking() {
Log.i(TAG, "User stopped speaking")
userIsTalking.value = false
}

override fun onTracksUpdated(tracks: Tracks) {
this@VoiceClientManager.tracks.value = tracks
}

override fun onInputsUpdated(camera: Boolean, mic: Boolean) {
this@VoiceClientManager.camera.value = camera
this@VoiceClientManager.mic.value = mic
}

override fun onConnected() {
expiryTime.value = client.value?.expiry?.let(Timestamp::ofEpochSecs)
}

override fun onDisconnected() {
expiryTime.value = null
actionDescriptions.value = null
botIsTalking.value = false
userIsTalking.value = false
state.value = null
actionDescriptions.value = null
botReady.value = false
tracks.value = null

client.value?.release()
client.value = null
}

override fun onUserAudioLevel(level: Float) {
userAudioLevel.floatValue = level
}

override fun onRemoteAudioLevel(level: Float, participant: Participant) {
botAudioLevel.floatValue = level
}
}

val client = RTVIClient(GeminiLiveWebsocketTransport.Factory(context), callbacks, options)

client.connect().displayErrors().withErrorCallback {
callbacks.onDisconnected()
}

this.client.value = client
}

fun enableMic(enabled: Boolean) {
client.value?.enableMic(enabled)?.displayErrors()
}

fun toggleMic() = enableMic(!mic.value)

fun stop() {
client.value?.disconnect()?.displayErrors()
}
}
< /code>
ПРИМЕЧАНИЕ: Stackoverflow заставляет меня сбрасывать немного текста без кода, поэтому я пишу эту строку. Пожалуйста, игнорируйте это.


Подробнее здесь: https://stackoverflow.com/questions/797 ... era-access
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»