Beispiel #1
0
    /// <summary>
    /// 语音合成
    /// </summary>
    /// <param name="sid"></param>
    /// <returns></returns>
    private SynthStatus SpeechSynthesis(string sid, string text, string name, string path)
    {
        string filename        = name + ".wav"; //合成的语音文件
        uint   audio_len       = 0;
        uint   audio_total_len = 0;

        synth_status = SynthStatus.MSP_TTS_FLAG_STILL_HAVE_DATA;
        ret          = MSC.QTTSTextPut(sid, text, (uint)Encoding.UTF8.GetByteCount(text), string.Empty);
        if (ret != (int)ErrorCode.MSP_SUCCESS)
        {
            Debug.Log("写入文本失败!" + ret); return(synth_status);
        }
        MemoryStream memoryStream = new MemoryStream();

        while (synth_status != SynthStatus.MSP_TTS_FLAG_DATA_END)
        {
            IntPtr source = MSC.QTTSAudioGet(sid, ref audio_len, ref synth_status, ref ret);
            if (ret != (int)ErrorCode.MSP_SUCCESS)
            {
                Debug.Log("合成失败!" + ret); return(synth_status);
            }
            byte[] array = new byte[(int)audio_len];
            if (audio_len > 0)
            {
                Marshal.Copy(source, array, 0, (int)audio_len);
                memoryStream.Write(array, 0, array.Length);
                audio_total_len = audio_total_len + audio_len;
            }
            Thread.Sleep(100);
        }

        //Debug.Log(string.Format("音频长度:byte[{0}],memoryStream[{1}]", audio_total_len, memoryStream.Length));
        //添加音频头,否则无法播放
        Utils.WAVE_Header wave_Header  = Utils.getWave_Header((int)memoryStream.Length + 44);
        byte[]            audio_header = Utils.StructToBytes(wave_Header);
        memoryStream.Position = 0;
        memoryStream.Write(audio_header, 0, audio_header.Length);
        memoryStream.Position = 0;
        if (filename != null)
        {
            FileStream fileStream = new FileStream(path + "/" + filename, FileMode.Create, FileAccess.Write);
            memoryStream.WriteTo(fileStream);
            memoryStream.Close();
            fileStream.Close();
        }
        return(synth_status);
    }