zoukankan      html  css  js  c++  java
  • 网络实现语音

    这段代码为网友wysaid提供,所以我拿来学习了。

    具体的功能是,输入一段文字,通过网络返回语音文件。

    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    #include <wininet.h>
    
    #pragma comment(lib, "wininet.lib")
    #pragma comment(lib, "winmm.lib")
    // 定义10M 的内存缓存。
    #define CACHE_SIZE    (10*1024*1024)
    #define BUFFER_SIZE    10000
    #ifndef MAX_PATH
    #define MAX_PATH 260
    #endif
    
    #define GOOGLE_URL "http://translate.google.cn/translate_tts?ie=UTF-8&q=%s&tl=zh-CN&total=1&idx=0&textlen=3&prev=input"
    
    char g_cache[CACHE_SIZE];
    
    bool getGoogleMp3FileByURL(LPCSTR url, LPCSTR filename, LPSTR cache)
    {
        HINTERNET hSession = InternetOpen("blog.wysaid.org", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
        if(hSession == NULL) return false;
        HINTERNET hHttp =  InternetOpenUrl(hSession, url, NULL, 0, INTERNET_FLAG_DONT_CACHE, 0);
        if(hHttp == NULL) return false;
        printf("正在请求 %s, 视网络状况不同可能会有一些等待...\n", filename);
        unsigned long buffersize = 0;
        InternetReadFile(hHttp, cache, CACHE_SIZE - 1, &buffersize);
        g_cache[buffersize] = 0;
        puts("文件获取成功,正在保存...");
        FILE *fp = fopen(filename, "wb");
        fwrite(g_cache, buffersize, 1, fp);
        fclose(fp);
        printf("文件 %s 保存成功!\n", filename);
        InternetCloseHandle(hHttp);
        InternetCloseHandle(hSession);
        return true;
    }
    
    void char2Hex(LPSTR srcStr, LPSTR dstStr, int n)
    {
        while(n--)
        {
            unsigned char c = *srcStr++;
            *dstStr++ = '%';
            *dstStr = c / 16 + '0';
            if(*dstStr > '9')
                *dstStr = *dstStr - '0' - 10 + 'A';
            ++dstStr;
            *dstStr = c % 16 + '0';
            if(*dstStr > '9')
                *dstStr = *dstStr - '0' - 10 + 'A';
            ++dstStr;
        }
        *dstStr = 0;
    }
    
    int GBK2Utf8(char* gbk, char* utf8)  
    {
        wchar_t uni[BUFFER_SIZE];
        MultiByteToWideChar(CP_ACP, 0, gbk, -1, uni, BUFFER_SIZE);
        return WideCharToMultiByte(CP_UTF8, 0, uni, -1, utf8, BUFFER_SIZE, NULL, NULL);  
    }
    
    void play(LPSTR filename)
    {
        char buffer[1024];
        sprintf(buffer, "open \"%s\" alias googlesnd", filename);
        mciSendStringA(buffer, NULL, 0, NULL);
        mciSendStringA("play googlesnd", NULL, 0, NULL);
    }
    
    int main()
    {
        char hexStr[BUFFER_SIZE], buffer[BUFFER_SIZE];
        char filename[MAX_PATH];
        
        puts("请输入一句话(中文哦),本程序将把你写在下面的话使用谷歌娘读出并保存为mp3文件哦!");
        gets(hexStr);
        memset(filename, 0, MAX_PATH);
        strncpy(filename, hexStr, 10);
        strcat(filename, ".mp3");
        char2Hex(buffer, hexStr, GBK2Utf8(hexStr, buffer));
        sprintf(buffer, GOOGLE_URL, hexStr);
        if(!getGoogleMp3FileByURL(buffer, filename, g_cache))
            puts("网络发生错误,无法读取。请确定你的机器可以联网!");
        else
        {
            puts("正在播放声音...");
            Sleep(100); // 别急,稍等一下。
            play(filename);
            puts("播放成功, 按任意键结束.");
            fflush(stdin);
            getchar();
        }
        mciSendStringA("close all", NULL, 0, NULL);
        return 0;
    }

    注意事项: 谷歌娘的地址可能更新,
    所以链接(定义的GOOGLE_URL)如果失效了本程序就无法正确工作。

  • 相关阅读:
    js对象写法
    IE6双边距bug及其解决办法
    图片轮播
    盒子水平和垂直同时居中方法
    选项卡切换
    针对IE6兼容png
    html5兼容
    sublime快捷键总结
    七种设计原则
    Git基本命令
  • 原文地址:https://www.cnblogs.com/galuo/p/3102281.html
Copyright © 2011-2022 走看看