使用.irf文件作为iOS上tts(文本转语音)引擎的声音资源

use*_*356 7 audio objective-c text-to-speech ios

无法在任何地方找到关于irf文件和tts(文本到语音)的任何信息,更不用说与iOS有关了.

虽然根据一些中国网站,它似乎在Android应用程序上用于GPS"音频".

那么......关于如何在iOS上使用irf文件作为音频数据库的任何想法?

样本IRF文件

-------------------------------------------

编辑:

github有一个帖子booxsdk/code/src/tts/aisound/,其中包含有关如何使用的C和C++文件:

样本IRF文件

这应该是如何让它在iOS上工作的一个重要线索,对于比我更大脑的人来说.

-------------------------------------------

编辑2:

样本C代码:

ivTTSStandardAPISample.c

// ivTTSStandardAPISample.c : Defines the entry point for the console application.
//

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "ivTTS.h"

/* constant for TTS heap size */
//#define ivTTS_HEAP_SIZE       38000 /* ahh */
#define ivTTS_HEAP_SIZE     58000 /* ohh */

/* constant for cache allocation */
#define ivTTS_CACHE_SIZE    512
#define ivTTS_CACHE_COUNT   1024
#define ivTTS_CACHE_EXT     8

/* Message */
ivTTSErrID DoMessage()
{
/* do stuff */
if(1)
{
    /* tts me up */
    return ivTTS_ERR_OK;
}
else
{
    /* exit */
    return ivTTS_ERR_EXIT;
}
}

FILE *fpOutput = 0;
/* output callback */
ivTTSErrID OnOutput(
    ivUInt16        nCode,          /* [in] output data code */
    ivCPointer      pcData,         /* [in] output data buffer */
    ivSize          nSize )         /* [in] output data size */
{
/* play */
/* something */
fwrite(pcData, 1, nSize, fpOutput);
return ivTTS_ERR_OK;
}

/* read resource callback */
void ivCall ReadResCB(
    ivPointer       pParameter,     /* [in] user callback parameter */
    ivPointer       pBuffer,        /* [out] read resource buffer */
    ivResAddress    iPos,           /* [in] read start position */
    ivResSize       nSize )         /* [in] read size */
{
FILE* pFile = (FILE*)pParameter;
fseek(pFile, iPos, SEEK_SET);
fread(pBuffer, nSize, 1, pFile);
}

/* output callback */
ivTTSErrID ivCall OutputCB(
    ivPointer       pParameter,     /* [in] user callback parameter */
    ivUInt16        nCode,          /* [in] output data code */
    ivCPointer      pcData,         /* [in] output data buffer */
    ivSize          nSize )         /* [in] output data size */
{
/* tts ma? */
ivTTSErrID tErr = DoMessage();
if ( tErr != ivTTS_ERR_OK ) return tErr;
/* play tts */
return OnOutput(nCode, pcData, nSize);
}

int main(void)
{
ivHTTS          hTTS;
ivPByte         pHeap;
ivTResPackDesc  tResPackDesc;
ivTTSErrID      ivReturn;

if (1)
{
    /* heap size */
    pHeap = (ivPByte)malloc(ivTTS_HEAP_SIZE);
    memset(pHeap, 0, ivTTS_HEAP_SIZE);
    fpOutput = fopen("OutPcm.pcm","wb+");
    if( !fpOutput )
        return 0;

    /* initalizing */
    /* can multipackage */
    tResPackDesc.pCBParam = fopen("..\\..\\Resource\\Resource.irf", "rb");
    tResPackDesc.pfnRead = ReadResCB;
    tResPackDesc.pfnMap = NULL;
    tResPackDesc.nSize = 0;

    if (tResPackDesc.pCBParam)
    {
        tResPackDesc.pCacheBlockIndex = (ivPUInt8)malloc(ivTTS_CACHE_COUNT + ivTTS_CACHE_EXT);
        tResPackDesc.pCacheBuffer = (ivPUInt8)malloc((ivTTS_CACHE_COUNT + ivTTS_CACHE_EXT)*(ivTTS_CACHE_SIZE));
        tResPackDesc.nCacheBlockSize = ivTTS_CACHE_SIZE;
        tResPackDesc.nCacheBlockCount = ivTTS_CACHE_COUNT;
        tResPackDesc.nCacheBlockExt = ivTTS_CACHE_EXT;
    }
    else
    {
        return 0;
    }

    /* TTS create */
    ivReturn = ivTTS_Create(&hTTS, (ivPointer)pHeap, ivTTS_HEAP_SIZE, ivNull, (ivPResPackDesc)&tResPackDesc, (ivSize)1);

    /* callback */
    ivReturn = ivTTS_SetParam(hTTS, ivTTS_PARAM_OUTPUT_CALLBACK, (ivUInt32)OutputCB);

    /* codepage */
    ivReturn = ivTTS_SetParam(hTTS, ivTTS_PARAM_INPUT_CODEPAGE, ivTTS_CODEPAGE_GBK);

    /* language */
    ivReturn = ivTTS_SetParam(hTTS, ivTTS_PARAM_LANGUAGE, ivTTS_LANGUAGE_CHINESE);  

    /* volume */
    ivReturn = ivTTS_SetParam(hTTS, ivTTS_PARAM_VOLUME, ivTTS_VOLUME_NORMAL);

    /************************************************************************
        tts
    ************************************************************************/
    /* speaker XIAOYAN */
    ivReturn = ivTTS_SetParam(hTTS, ivTTS_PARAM_ROLE, ivTTS_ROLE_XIAOYAN);
    ivReturn = ivTTS_SynthText(hTTS, ivText("?????????????????"), -1);
    ivReturn = ivTTS_SynthText(hTTS, ivText("Hello, this is iFLYTEK TTS system."), -1);
    /* speaker TERRY */
    ivReturn = ivTTS_SetParam(hTTS, ivTTS_PARAM_ROLE, ivTTS_ROLE_TERRY);
    ivReturn = ivTTS_SetParam(hTTS, ivTTS_PARAM_LANGUAGE, ivTTS_LANGUAGE_ENGLISH);
    ivReturn = ivTTS_SynthText(hTTS, ivText("Hello, this is iFLYTEK TTS system."), -1);

    /* anti-initializing */
    ivReturn = ivTTS_Destroy(hTTS);

    if ( tResPackDesc.pCacheBlockIndex )
    {
        free(tResPackDesc.pCacheBlockIndex);
    }
    if ( tResPackDesc.pCacheBuffer )
    {
        free(tResPackDesc.pCacheBuffer);
    }
    if ( pHeap )
    {
        free(pHeap);
    }
}
fclose(tResPackDesc.pCBParam);
fclose(fpOutput);   
return 0;
}
Run Code Online (Sandbox Code Playgroud)

-------------------------------------------

编辑3:

这会一直显示在我的搜索中:

AiSound 4内核API

这是一份CPP文件:

#include "yx_common.h"

pthread_t g_pthreadTTS;

int g_Handle = -1;
char *g_MappedMem = (char *)MAP_FAILED;

/* read resource callback */
ivBool ivCall ReadResCB(ivPointer pParameter, ivPointer pBuffer, ivResAddress iPos, ivResSize nSize )
{
memcpy(pBuffer, g_MappedMem+iPos, nSize);
return ivTrue;
}

ivTTSErrID ivCall OutputCB(ivPointer pParameter, ivUInt16 nCode, ivCPointer pcData, ivSize nSize )
{
/*  */
WriteBuf(0, (BYTE *)pcData, nSize, 'T');
return ivTTS_ERR_OK;
}

ivTTSErrID ivCall ParamChangeCB(ivPointer pParameter, ivUInt32 nParamID, ivUInt32 nParamValue )
{
return ivTTS_ERR_OK;
}

ivTTSErrID ivCall ProgressCB(ivPointer pParameter, ivUInt32 iProcPos, ivUInt32 nProcLen )
{
return ivTTS_ERR_OK;
}

int InitTTS()
{
g_Handle = open("/lib/Resource.irf", O_RDONLY);
if( g_Handle==-1 ) goto ERROR;

g_MappedMem = (char *)mmap(NULL, RESOUSE_SIZE, PROT_READ, MAP_SHARED, g_Handle, 0);
if( g_MappedMem==MAP_FAILED ) goto ERROR;

return 0;

ERROR:
PRTMSG(MSG_ERR, "init tts error\n");
close(g_Handle);
return -1;
}

int ReleaseTTS()
{
munmap(g_MappedMem, RESOUSE_SIZE);
close(g_Handle);

g_Handle = -1;
g_MappedMem = (char *)MAP_FAILED;
}

void MakeTTS(char* v_pText)
{
ivHTTS  hTTS;
ivPByte pHeap;
ivTTSErrID  ivReturn;

/* */
pHeap = (ivPByte)malloc(ivTTS_HEAP_SIZE);
memset(pHeap, 0, ivTTS_HEAP_SIZE);

/* */
ivTResPackDescExt tResPackDesc;
tResPackDesc.pCBParam = NULL;
tResPackDesc.pfnRead = ReadResCB;
tResPackDesc.pfnMap = NULL;
tResPackDesc.nSize = 0;

tResPackDesc.pCacheBlockIndex = NULL;
tResPackDesc.pCacheBuffer = NULL;
tResPackDesc.nCacheBlockSize = 0;
tResPackDesc.nCacheBlockCount = 0;
tResPackDesc.nCacheBlockExt = 0;

/* */
ivReturn = ivTTS_Create(&hTTS, (ivPointer)pHeap, ivTTS_HEAP_SIZE, ivNull, (ivPResPackDescExt)&tResPackDesc, (ivSize)1, NULL);
ivReturn = ivTTS_SetParam(hTTS, ivTTS_PARAM_OUTPUT_CALLBACK, (ivUInt32)OutputCB);/*  */
ivReturn = ivTTS_SetParam(hTTS, ivTTS_PARAM_PARAMCH_CALLBACK, (ivUInt32)ParamChangeCB);/*  */
ivReturn = ivTTS_SetParam(hTTS, ivTTS_PARAM_PROGRESS_CALLBACK, (ivUInt32)ProgressCB);/*  */
ivReturn = ivTTS_SetParam(hTTS, ivTTS_PARAM_INPUT_CODEPAGE, ivTTS_CODEPAGE_GBK);/*  */
ivReturn = ivTTS_SetParam(hTTS, ivTTS_PARAM_LANGUAGE, ivTTS_LANGUAGE_CHINESE);  /* */
ivReturn = ivTTS_SetParam(hTTS, ivTTS_PARAM_VOLUME, ivTTS_VOLUME_NORMAL);/* */
ivReturn = ivTTS_SetParam(hTTS, ivTTS_PARAM_ROLE, ivTTS_ROLE_XIAOFENG);/* XIAOFENG */
ivReturn = ivTTS_SynthText(hTTS, ivText(v_pText), MAX_UNSIGNED_32);/* */

/*  */
ivReturn = ivTTS_Destroy(hTTS);

if( tResPackDesc.pCacheBlockIndex )
    free(tResPackDesc.pCacheBlockIndex);

if( tResPackDesc.pCacheBuffer )
    free(tResPackDesc.pCacheBuffer);

if( pHeap )
    free(pHeap);
}

void *PlayTTS(void *arg)
{
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);

int iRet;

IOSET( IOS_TRUMPPOW, IO_TRUMPPOW_ON );//
IOSET( IOS_EARPHONESEL, IO_EARPHONESEL_OFF );//
IOSET( IOS_AUDIOSEL, IO_AUDIOSEL_PC );//

msleep(200);

#if VEHICLE_TYPE == VEHICLE_M
BYTE TBuf[960] = {0};
ADEC_CHN iAdecChn = -1;
AUDIO_RAWDATA_S objAudioRawData = {AUDIO_BIT_WIDTH_16, AUDIO_SAMPLE_RATE_8, 0, 0, (short *)TBuf, (uint)sizeof(TBuf)};

if( !g_objCtrlStart.APlayback[0] )
{
    iRet = HI_ADEC_CreateCH(0, AUDIO_CODEC_FORMAT_ADPCM , HI_TRUE , &iAdecChn); 
    if(iRet)
    {
        PRTMSG(MSG_ERR, "create audio playback chn1 failed: %08x\n", iRet);
        goto TTS_PLAY_STOP;
    }

    iRet = HI_ADEC_StartCH(iAdecChn, 0); 
    if(iRet) 
    {
        PRTMSG(MSG_ERR, "start audio playback chn1 failed: %08x\n", iRet);
        goto TTS_PLAY_STOP;
    }
}
else
{
    g_objPlaybackCtrl.APause = TRUE;// 
}
#endif

#if VEHICLE_TYPE == VEHICLE_V8 || VEHICLE_TYPE == VEHICLE_M2
BYTE TBuf[960] = {0};
AUDIO_FRAME_S objAudioRawData;
objAudioRawData.enBitwidth = AUDIO_BIT_WIDTH_16;
objAudioRawData.enSoundmode = AUDIO_SOUND_MODE_MOMO;
objAudioRawData.u64TimeStamp = 0;
objAudioRawData.u32Seq = 0;
objAudioRawData.u32Len = sizeof(TBuf);

if( !g_objCtrlStart.APlayback[0] )
{
    SwitchAo(AUDIO_SAMPLE_RATE_8000);

    ADEC_ATTR_ADPCM_S objAdpcmAttr;
    ADEC_CHN_ATTR_S objChnAttr;

    objAdpcmAttr.enADPCMType = ADPCM_TYPE_IMA;
    objChnAttr.enType = PT_ADPCMA;
    objChnAttr.u32BufSize = 8;
    objChnAttr.enMode = ADEC_MODE_STREAM;
    objChnAttr.pValue = &objAdpcmAttr;

    iRet = HI_MPI_ADEC_CreateChn(0, &objChnAttr);
    if(iRet)
    {
        PRTMSG(MSG_ERR, "create audio playback chn1 failed: %08x\n", iRet);
        goto TTS_PLAY_STOP;
    }
}
else
{
    g_objPlaybackCtrl.APause = TRUE;// 
    sleep(1);
    SwitchAo(AUDIO_SAMPLE_RATE_8000);
}
#endif

g_objWorkStart.TTS = TRUE;

while( !g_objWorkStop.TTS && ReadBuf(0, TBuf, sizeof(TBuf), 'T') )
{
#if VEHICLE_TYPE == VEHICLE_M
    HI_ADEC_SendRawData(0, &objAudioRawData);//
#endif

#if VEHICLE_TYPE == VEHICLE_V8 || VEHICLE_TYPE == VEHICLE_M2
    memcpy(objAudioRawData.aData, TBuf, sizeof(TBuf));
    HI_MPI_AO_SendFrame(0, 0, &objAudioRawData, HI_IO_BLOCK);
#endif

    memset(TBuf, 0, sizeof(TBuf));
}

#if VEHICLE_TYPE == VEHICLE_M
HI_ADEC_SendRawData(0, &objAudioRawData);//
#endif

#if VEHICLE_TYPE == VEHICLE_V8 || VEHICLE_TYPE == VEHICLE_M2
memcpy(objAudioRawData.aData, TBuf, sizeof(TBuf));
HI_MPI_AO_SendFrame(0, 0, &objAudioRawData, HI_IO_BLOCK);
#endif

TTS_PLAY_STOP:

g_objWorkStop.TTS = FALSE;
WriteBuf(0, NULL, 0, 'T');//

sleep(3);//

IOSET( IOS_TRUMPPOW, IO_TRUMPPOW_OFF );//
IOSET( IOS_EARPHONESEL, IO_EARPHONESEL_ON );//
IOSET( IOS_AUDIOSEL, IO_AUDIOSEL_PHONE );//

#if VEHICLE_TYPE == VEHICLE_M
if( !g_objCtrlStart.APlayback[0] )
{
    //
    HI_ADEC_StopCH(iAdecChn); 
    HI_ADEC_DestroyCH(iAdecChn, HI_TRUE); 
}
else
{
    g_objPlaybackCtrl.APause = FALSE;
}
#endif
#if VEHICLE_TYPE == VEHICLE_V8 || VEHICLE_TYPE == VEHICLE_M2
if( !g_objCtrlStart.APlayback[0] )
{
    //
    HI_MPI_ADEC_DestroyChn(0);
    SwitchAo(AUDIO_SAMPLE_RATE_32000);
}
else
{
    SwitchAo(AUDIO_SAMPLE_RATE_32000);
    sleep(1);
    g_objPlaybackCtrl.APause = FALSE;
}
#endif

g_objWorkStart.TTS = FALSE;

pthread_exit(0);
}

int StartTTS()
{
if( !g_objWorkStart.TTS )
{
    PRTMSG(MSG_NOR, "Start TTS\n");

    int iRet = pthread_create(&g_pthreadTTS, NULL, PlayTTS, NULL);
    if(iRet) 
    {
        PRTMSG(MSG_ERR, "start tts failed: %08x\n", iRet);
        return -1;
    }

    sleep(1);//
    return 0;
}

return -1;
}

int StopTTS()
{
if( g_objWorkStart.TTS )
{
    PRTMSG(MSG_NOR, "Stop TTS\n");

    g_objWorkStop.TTS = TRUE;
    pthread_join(g_pthreadTTS, NULL);

    PRTMSG(MSG_NOR, "stop tts succ\n");
    return 0;
}

return -1;
}


int TTSTest(char* v_pText)
{
int iRet;

IOSET( IOS_TRUMPPOW, IO_TRUMPPOW_ON );//
IOSET( IOS_EARPHONESEL, IO_EARPHONESEL_OFF );//
IOSET( IOS_AUDIOSEL, IO_AUDIOSEL_PC );//

msleep(100);

MakeTTS(v_pText);

#if VEHICLE_TYPE == VEHICLE_M
BYTE TBuf[960] = {0};
ADEC_CHN iAdecChn = -1;
AUDIO_RAWDATA_S objAudioRawData = {AUDIO_BIT_WIDTH_16,   AUDIO_SAMPLE_RATE_8, 0, 0, (short *)TBuf, (uint)sizeof(TBuf)};

iRet = HI_ADEC_CreateCH(0, AUDIO_CODEC_FORMAT_ADPCM , HI_TRUE , &iAdecChn); 
if(iRet)
{
    PRTMSG(MSG_ERR, "create audio playback chn1 failed: %08x\n", iRet);
    goto TTS_PLAY_STOP;
}

iRet = HI_ADEC_StartCH(iAdecChn, 0); 
if(iRet) 
{
    PRTMSG(MSG_ERR, "start audio playback chn1 failed: %08x\n", iRet);
    goto TTS_PLAY_STOP;
}
#endif
#if VEHICLE_TYPE == VEHICLE_V8 || VEHICLE_TYPE == VEHICLE_M2
BYTE TBuf[960] = {0};
AUDIO_FRAME_S objAudioRawData;
objAudioRawData.enBitwidth = AUDIO_BIT_WIDTH_16;
objAudioRawData.enSoundmode = AUDIO_SOUND_MODE_MOMO;
objAudioRawData.u64TimeStamp = 0;
objAudioRawData.u32Seq = 0;
objAudioRawData.u32Len = sizeof(TBuf);

ADEC_ATTR_ADPCM_S objAdpcmAttr;
ADEC_CHN_ATTR_S objChnAttr;
objAdpcmAttr.enADPCMType = ADPCM_TYPE_IMA;
objChnAttr.enType = PT_ADPCMA;
objChnAttr.u32BufSize = 8;
objChnAttr.enMode = ADEC_MODE_STREAM;
objChnAttr.pValue = &objAdpcmAttr;

SwitchAo(AUDIO_SAMPLE_RATE_8000);

iRet = HI_MPI_ADEC_CreateChn(0, &objChnAttr);
if(iRet)
{
    PRTMSG(MSG_ERR, "create audio playback chn1 failed: %08x\n", iRet);
    goto TTS_PLAY_STOP;
}
#endif

while( ReadBuf(0, TBuf, sizeof(TBuf), 'T') )
{
#if VEHICLE_TYPE == VEHICLE_M
    HI_ADEC_SendRawData(0, &objAudioRawData);//
#endif
#if VEHICLE_TYPE == VEHICLE_V8 || VEHICLE_TYPE == VEHICLE_M2
    memcpy(objAudioRawData.aData, TBuf, sizeof(TBuf));
    HI_MPI_AO_SendFrame(0, 0, &objAudioRawData, HI_IO_BLOCK);
#endif
    memset(TBuf, 0, sizeof(TBuf));
}

#if VEHICLE_TYPE == VEHICLE_M
HI_ADEC_SendRawData(0, &objAudioRawData);//
#endif
#if VEHICLE_TYPE == VEHICLE_V8 || VEHICLE_TYPE == VEHICLE_M2
memcpy(objAudioRawData.aData, TBuf, sizeof(TBuf));
HI_MPI_AO_SendFrame(0, 0, &objAudioRawData, HI_IO_BLOCK);
#endif

TTS_PLAY_STOP:
WriteBuf(0, NULL, 0, 'T');//

sleep(3);//

IOSET( IOS_TRUMPPOW, IO_TRUMPPOW_OFF );//
IOSET( IOS_EARPHONESEL, IO_EARPHONESEL_ON );//
IOSET( IOS_AUDIOSEL, IO_AUDIOSEL_PHONE );//

#if VEHICLE_TYPE == VEHICLE_M

HI_ADEC_StopCH(iAdecChn); //
HI_ADEC_DestroyCH(iAdecChn, HI_TRUE); 
#endif
#if VEHICLE_TYPE == VEHICLE_V8 || VEHICLE_TYPE == VEHICLE_M2
HI_MPI_ADEC_DestroyChn(0);//
SwitchAo(AUDIO_SAMPLE_RATE_32000);
#endif
}
Run Code Online (Sandbox Code Playgroud)