create or replace package body pck_26ai_apis as procedure api_text2speech (p_text in varchar2, p_filename in varchar2, p_bucket in varchar2 , p_comp_id in varchar2, p_credential in varchar2 default 'OCI_CRED', p_speaker in varchar2 default 'Felix', p_language_code in varchar2 default 'pt-BR') as -- -- Gerar audio a partir de TXT -- -- API para gerar speech do resultado: https://docs.oracle.com/en-us/iaas/api/#/en/speech/20220101/SynthesizeSpeech/SynthesizeSpeech -- https://apexapps.oracle.com/pls/apex/r/dbpm/livelabs/run-workshop?p210_wid=3135&p210_wec=&session=107708964662539 -- -- Text to Speech is only available in the US West (Phoenix) commercial region. -- https://docs.oracle.com/en-us/iaas/Content/speech/using/speech.htm -- Text to speech supports maximum 10000 characters per request. -- -- Pre requisito: https://docs.oracle.com/en-us/iaas/Content/speech/using/policies.htm -- Policy: ai-service-speech-family -- -- ALLOW GROUP TO USE ai-services IN COMPARTMENT autonomous-db-compartment -- -- -- URL da API OCI Synthesize Speech l_url VARCHAR2(4000) := 'https://speech.aiservice.us-phoenix-1.oci.oraclecloud.com/20220101/actions/synthesizeSpeech'; -- definicao do object storage para armazenar o MP3 -- especifique com / no final v_object_storage varchar2(500) := p_bucket; -- Variáveis para a requisição e resposta l_request_body CLOB; l_request_blob BLOB; l_response_body BLOB; begin -- Criar o JSON do corpo da requisição l_request_body := '{ "audioConfig": { "configType": "BASE_AUDIO_CONFIG" }, "compartmentId": "' || p_comp_id || '", "configuration": { "modelDetails": { "modelName": "TTS_2_NATURAL", "languageCode":"' || p_language_code || '", "voiceId": "' || p_speaker || '" }, "modelFamily": "ORACLE", "speechSettings": { "outputFormat": "MP3", "sampleRateInHz": 23600, "textType": "TEXT" } }, "isStreamEnabled": false, "text": "' || replace(replace(replace(replace(p_text, chr(13),''), chr(10),''), '"',''), '\n','') || '" }'; l_request_blob := apex_util.clob_to_blob(p_clob => l_request_body,p_charset => 'AL32UTF8'); -- Limpar os cabeçalhos antes de definir novos APEX_WEB_SERVICE.CLEAR_REQUEST_HEADERS; -- Definir os cabeçalhos da requisição APEX_WEB_SERVICE.G_REQUEST_HEADERS(1).NAME := 'Content-Type'; APEX_WEB_SERVICE.G_REQUEST_HEADERS(1).VALUE := 'application/json'; APEX_WEB_SERVICE.G_REQUEST_HEADERS(2).NAME := 'Accept'; APEX_WEB_SERVICE.G_REQUEST_HEADERS(2).VALUE := 'audio/mpeg'; -- Chamar a API REST da OCI l_response_body := APEX_WEB_SERVICE.MAKE_REST_REQUEST_B( p_url => l_url, p_http_method => 'POST', p_body_blob => l_request_blob, p_credential_static_id => 'apex_cred' ); -- Salvar o áudio no Object Storage DBMS_CLOUD.PUT_OBJECT( credential_name => p_credential, object_uri => v_object_storage || p_filename, contents => l_response_body ); end; -- -- Visio: https://docs.oracle.com/pt-br/solutions/ai-vision-extract-data/index.html#GUID-A4FD65D0-BF62-472B-B4C7-0ADF5425A566 -- function api_visio( p_id in number, p_feature_type in varchar2 , p_comp_id in varchar2) return clob as /* p_feature_type: https://docs.oracle.com/en-us/iaas/api/#/en/vision/20220125/datatypes/ImageFeature IMAGE_CLASSIFICATION: Label the image. OBJECT_DETECTION: Identify objects in the image with bounding boxes. TEXT_DETECTION: Recognize text at the word and line level. FACE_DETECTION: Identify faces in the image with bounding boxes and face landmarks. */ base64_image CLOB; v_endpoint varchar2(500) := 'https://vision.aiservice.us-chicago-1.oci.oraclecloud.com/20220125/actions/analyzeImage'; request_json CLOB; l_response_body clob; begin select APEX_WEB_SERVICE.BLOB2CLOBBASE64( FILE_BLOB ,'N','N' ) into base64_image from TB_26AI_MANUFATURA --TB_26AI_FINANCE where id = p_id; request_json := to_clob('{ "compartmentId": "' || p_comp_id || '", "image": { "source":"INLINE", "data":"' || base64_image || '" }, "features":[ { "featureType":"' || p_feature_type || '", "maxResults": 5 } ] }' ); -- Definir os cabeçalhos da requisição APEX_WEB_SERVICE.G_REQUEST_HEADERS(1).NAME := 'Content-Type'; APEX_WEB_SERVICE.G_REQUEST_HEADERS(1).VALUE := 'application/json'; APEX_WEB_SERVICE.G_REQUEST_HEADERS(2).NAME := 'Accept'; APEX_WEB_SERVICE.G_REQUEST_HEADERS(2).VALUE := 'application/json'; -- Faça a chamada POST usando APEX_WEB_SERVICE e a credencial OCI l_response_body := APEX_WEB_SERVICE.make_rest_request( p_url => v_endpoint, p_http_method => 'POST', p_body => request_json, p_credential_static_id => 'apex_cred' ); return l_response_body; end ; -- -- Document Understanding: https://docs.oracle.com/en-us/iaas/api/#/en/document-understanding/20221109/ -- function api_doc_understanding(p_id in number, p_feature_type in varchar2 , p_comp_id in varchar2) return clob as /* p_feature_type: https://docs.oracle.com/en-us/iaas/api/#/en/document-understanding/20221109/datatypes/DocumentClassificationFeature DOCUMENT_CLASSIFICATION TABLE_EXTRACTION TEXT_EXTRACTION LANGUAGE_CLASSIFICATION KEY_VALUE_EXTRACTION */ v_endpoint varchar2(500) := 'https://document.aiservice.sa-saopaulo-1.oci.oraclecloud.com/20221109/actions/analyzeDocument'; request_json CLOB; v_base64 CLOB; l_response_body clob; begin select APEX_WEB_SERVICE.BLOB2CLOBBASE64( FILE_BLOB ,'N','N' ) into v_base64 from TB_26AI_MANUFATURA_CATALOGO where id = p_id; if upper(p_feature_type) = 'KEY_VALUE_EXTRACTION' then request_json := to_clob('{ "compartmentId": "' || p_comp_id || '", "features": [ { "featureType": "' || upper(p_feature_type) || '", "selectionMarkDetection": true } ], "documentType": "INVOICE", "document": { "source": "INLINE", "data": "' || v_base64 || '" } }'); else request_json := to_clob('{ "compartmentId": "' || p_comp_id || '", "features": [ { "featureType": "' || upper(p_feature_type) || '", "selectionMarkDetection": true } ], "document": { "source": "INLINE", "data": "' || v_base64 || '" } }'); end if; -- Definir os cabeçalhos da requisição APEX_WEB_SERVICE.G_REQUEST_HEADERS(1).NAME := 'Content-Type'; APEX_WEB_SERVICE.G_REQUEST_HEADERS(1).VALUE := 'application/json'; APEX_WEB_SERVICE.G_REQUEST_HEADERS(2).NAME := 'Accept'; APEX_WEB_SERVICE.G_REQUEST_HEADERS(2).VALUE := 'application/json'; -- Faça a chamada POST usando APEX_WEB_SERVICE e a credencial OCI l_response_body := APEX_WEB_SERVICE.make_rest_request( p_url => v_endpoint, p_http_method => 'POST', p_body => request_json, p_credential_static_id => 'apex_cred' ); return l_response_body; end; -- -- Language: https://docs.oracle.com/en-us/iaas/api/#/en/language/20221001/ -- function api_translate(p_data_text in clob,p_source_code in varchar2 default 'en', p_target_code in varchar2 default 'pt-BR' , p_comp_id in varchar2 ) return clob as /* https://docs.oracle.com/en-us/iaas/api/#/en/language/20221001/BatchLanguageTranslation/BatchLanguageTranslation */ v_endpoint varchar2(500) := 'https://language.aiservice.sa-saopaulo-1.oci.oraclecloud.com/20221001/actions/batchLanguageTranslation'; request_json CLOB; l_response_body clob; begin request_json := to_clob('{ "compartmentId": "' || p_comp_id || '", "documents":[{ "key":"1", "text":"' || p_data_text || '", "languageCode":"' || p_source_code || '" }], "targetLanguageCode":"' || p_target_code || '" } '); -- Definir os cabeçalhos da requisição APEX_WEB_SERVICE.G_REQUEST_HEADERS(1).NAME := 'Content-Type'; APEX_WEB_SERVICE.G_REQUEST_HEADERS(1).VALUE := 'application/json'; -- Faça a chamada POST usando APEX_WEB_SERVICE e a credencial OCI l_response_body := APEX_WEB_SERVICE.make_rest_request( p_url => v_endpoint, p_http_method => 'POST', p_body => request_json, p_credential_static_id => 'apex_cred' ); return json_value( l_response_body, '$.documents[0].translatedText'); end; end; -- package; /